PKU 1321 棋盘问题(搜索+剪枝)
#include<iostream> #include<cstring> using namespace std; int n,m,k,vis[10],ans; char c[10][10]; void dfs(int i) { if(m==k) { ans++; return ; } if(i>=n) return ; for(int j=0;j<n;j++) { if(!vis[j]&&c[i][j]=='#') { vis[j]=1; m++; dfs(i+1); m--; vis[j]=0; } } dfs(i+1);//第i行不放棋子 } int main() { int i,j; scanf("%d%d",&n,&k); while(n!=-1&&k!=-1){ for(i=0;i<n;i++) { for(j=0;j<n;j++) cin>>c[i][j]; } memset(vis,0,sizeof(vis)); m=0; ans=0; dfs(0); printf("%d\n",ans); scanf("%d%d",&n,&k); } return 0; }