棋盘问题 DFS+回溯
来源:互联网 发布:沃伦夫妇纪录片 知乎 编辑:程序博客网 时间:2024/05/22 13:57
/*DFS+回溯。*/#include <stdio.h>#include <cstring>int n,k,ans;char map[9][9];bool vis[100];bool x[9],y[9];void dfs(int sum,int col){ if(sum>=k) { ans++; return ; } if(col>n) return ; for(int i=0;i<n;i++) { if(map[i][col]=='#'&&!x[i]&&!y[col]) { x[i]=true; y[col]=true; dfs(sum+1,col+1);//符合条件的,传入sum+1进行深搜。 x[i]=false;//回溯的过程中注意将标记进行还原。 y[col]=false; } } dfs(sum,col+1);//不符合条件的,传入sum进行深搜。}int main(){ while(scanf("%d%d",&n,&k)==2) { if(n==-1&&k==-1) break; char op[9]; for(int i=0;i<n;i++) { scanf("%s",op); for(int j=0;j<n;j++) map[i][j]=op[j]; } memset(x,false,sizeof(x)); memset(y,false,sizeof(y)); memset(vis,false,sizeof(vis)); ans=0; dfs(0,0); printf("%d\n",ans); } return 0;}