POJ 1321 棋盘问题 dfs
题目:http://poj.org/problem?id=1321
解法:一个比较经典的dfs问题,可以dfs每一行,保证每一行只放一颗棋子,然后标记相应的列即可。
AC:
#include<stdio.h> #include<string.h> int n,k; char map[10][10]; int vis[10]; int count; void Dfs(int index,int num) { if(index>=n&&num!=0)return; if(num>n-index)return; //一个剪枝,即如果剩下的行数<剩下的棋子数, // 那这种方案肯定不行,就直接return结束 if(num==0){ //棋子按要求放完了,即又找到了一种方案 count++; return; } int i; for(i=0;i<n;i++){ if(map[index][i]=='.')continue; if(vis[i])continue; vis[i]=1; //标记列 Dfs(index+1,num-1); //表示这一行要放棋子 vis[i]=0; //回溯后,说明摆好棋子的状态已经记录,当前的列标记还原 } Dfs(index+1,num); //表示这一行不放棋子 //当k<n时,index在等于n之前可能就已经全部摆好了,又因为全部棋子摆好后的某个棋盘状态已经在前面循环时记录了,因此为了处理多余行,令当前位置先不放棋子,搜索下一行放棋子的情况。 } int main() { int i; while(scanf("%d %d",&n,&k)!=EOF){ if(n==-1&&k==-1)break; count=0; for(i=0;i<n;i++){ scanf("%s",map[i]); } memset(vis,0,sizeof(vis)); Dfs(0,k); //从第0行开始dfs printf("%d\n",count); } return 0; }