首页 > 代码库 > poj1321__棋盘问题

poj1321__棋盘问题

题目地址:http://poj.org/problem?id=1321

 

题目大意:给定正方形棋盘的边长与棋子数目,棋盘内只有特定形状的位置能放棋子,要求计算出将每个棋子以不同列不同行的方式放在能放棋子的位置的方案总数。

 

how:简单的深搜,确定好递归条件和函数弹回条件。

#include<stdio.h>
#include<string.h>
#include<iostream>

using namespace std;

char a[500][500];
int flag[500];

int n,k,m;//m是已经放了的棋子数目
int ans;

void dfs(int s){
    if(k==m){
        ans++;
        return;
    }
    if(s>=n)
        return;//以上两条都是回弹条件
    for(int j=0;j<n;j++)
    if(flag[j]==0&&a[s][j]==#){//递归的条件,一般深搜我喜欢用标志数组记录访问过的位置,并且在回弹后,清楚访问记录
        m++;
        flag[j]=1;
        dfs(s+1);
        flag[j]=0;
        m--;
    }
    dfs(s+1);//另起一行

}
int main(){

    while(scanf("%d%d",&n,&k)&&n!=-1&&k!=-1){
            m=0;
            ans =0;
        for(int i=0;i<n;i++){
            for(int j=0;j<n;j++){
                cin>>a[i][j];
            }
        }
        memset(flag,0,sizeof(flag));
        dfs(0);
        cout<<ans<<endl;
    }
}

暑假修炼之路,从水题开始做起~

poj1321__棋盘问题