POJ - 1321 棋盘问题 (DFS递归)
2026/7/28 18:40:04 网站建设 项目流程

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。

Input

输入含有多组测试数据。
每组数据的第一行是两个正整数,n, k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为 -1 -1 时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。

Output

对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。

Sample Input

2 1 #. .# 4 4 ...# ..#. .#.. #... -1 -1

Sample Output

2 1

层层递归

#include<iostream> #include<cstring> using namespace std; char c[10][10]; int flag[10]; long long ans; int n,k,m; void dfs(int y) { if(m==k) { ans++; return ; } if(y>n) return ; for(int i=1; i<=n; i++) //遍历一行 { if(!flag[i]&&c[y][i]=='#') //由于不能在同列,可用一维数组记录该列是否有棋子 { flag[i]=1; m++; dfs(y+1); //该位置标记过了再去遍历后面的 flag[i]=0; //取消标记该位置 m--; } } dfs(y+1); //跳转到下一层 } int main() { while(cin>>n>>k) { if(n==-1&&k==-1) break; memset(flag,0,sizeof(flag)); for(int i=1; i<=n; i++) { for(int j=1; j<=n; j++) { cin>>c[i][j]; } } ans=0,m=0; dfs(1); cout<<ans<<endl; } return 0; }

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询