这题想了好久,看了八皇后问题,这题比八皇后问题麻烦的地方是:棋子少于棋盘的行数时,要不断地递归和回溯。直接上代码(没有任何剪枝) #include<iostream> using namespace std; int board[9][9],col[9],count; void dfs(int n,int k,int line)//k是当前剩余的棋子数,line是当前要试探的行 { int i,j; for(j=1;j<=n;j++) if(board[line][j]&&!col[j]) { if(k==1) { count++; continue; } col[j]=1; for(i=line+1;i<=n;i++) dfs(n,k-1,i); col[j]=0; } } int main() { int b,num,c,r; char chr; while(scanf("%d%d",&b,&num)) { if(b==-1&&num==-1) break; getchar(); for(r=1;r<=b;r++) { for(c=1;c<=b;c++) { scanf("%c",&chr); if(chr=='#') board[r][c]=1; else board[r][c]=0; } getchar(); } if(num==0||b==0) { printf("0/n"); continue; } count=0; for(r=1;r<=b-num+1;r++) { memset(col,0,sizeof(col)); dfs(b,num,r); } printf("%d/n",count); } return 0; }