棋盘问题 POJ - 1321
#include<cstdio> #include<cstring> using namespace std; int n,k,ans; char Map[20][20],visL[11]; //标记列 void dfs(int step,int i) // step已放的棋子数, i 当前第几行 { if(step==k) { ans++; return; } if(i>n)return; for(int j=1;j<=n;j++) { if(Map[i][j]=='#'&&!visL[j]) { visL[j]=1; dfs(step+1,i+1); //i行放棋子 visL[j]=0; } } dfs(step,i+1); //i行不放棋子 } int main() { while(~scanf("%d%d",&n,&k)) { if(n==-1&&k==-1)break; for(int i=1;i<=n;i++) scanf("%s",Map[i]+1); memset(visL,0,sizeof(visL)); ans=0; dfs(0,1); printf("%d\n",ans); } return 0; }