/**
* poj1321 DFS
* 这个题自己当时并没有直接想出来,而是参考的网上别人的思路 其实能想到是DFS,但是思路里DFS的特别设计是我没有想到的
* 首先,这个dfs使用了行和棋子数两个参数,而不像之前字符串排序那样只需要一个参数
* 行作为参数就可以确定哪些行已经被搜索,哪些行尚未被搜索,那么只需要标记哪些列被搜索过就可以了
* 第二,由于存在k<n的情况,这就意味着可能有些行里是没有棋子的,那么我们在dfs的实现中加入了最后一行,即允许当前行为空行,这就很简单地解决了k<n的情况
*/
#include <cstdio>
using namespace std;
const int MAX_NUM = 8;
bool cb[MAX_NUM][MAX_NUM];//chessboard
bool col_flag[MAX_NUM];
int count;
void dfs(int row,int num,int chessnum,int boardwide){
if(num == chessnum){
++count;
return;
}
if(row >= boardwide){
return;
}
for(int i=0;i<boardwide;++i){
if(cb[row][i] && !col_flag[i]){
col_flag[i] = true;
dfs(row+1,num+1,chessnum,boardwide);
col_flag[i] = false;
}
}
dfs(row+1,num,chessnum,boardwide);//for case k<n
}
int main(){
int n,k;
char tmp;
while(scanf("%d%d",&n,&k)){
if(n == -1 && k == -1){
break;
}
getchar();
for(int i=0;i<n;++i){
for(int j=0;j<n;++j){
scanf("%c",&tmp);
if(tmp == '#'){
cb[i][j] = true;
}
else if(tmp == '.'){
cb[i][j] = false;
}
}
getchar();
col_flag[i] = false;
}
count = 0;
dfs(0,0,k,n);
printf("%d\n",count);
}
return 0;
}
poj1321 DFS
最新推荐文章于 2018-09-23 17:09:58 发布