杨浦企业网站建设,陕西建设厅八大员官方网站,网站架构设计师有哪些学校可以报考,安徽智能网站建设在一个给定形状的棋盘#xff08;形状可能是不规则的#xff09;上面摆放棋子#xff0c;棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列#xff0c;请编程求解对于给定形状和大小的棋盘#xff0c;摆放k个棋子的所有可行的摆放方案C。
Input …在一个给定形状的棋盘形状可能是不规则的上面摆放棋子棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列请编程求解对于给定形状和大小的棋盘摆放k个棋子的所有可行的摆放方案C。
Input
输入含有多组测试数据。 每组数据的第一行是两个正整数n k用一个空格隔开表示了将在一个n*n的矩阵内描述棋盘以及摆放棋子的数目。 n 8 , k n 当为-1 -1时表示输入结束。 随后的n行描述了棋盘的形状每行有n个字符其中 # 表示棋盘区域 . 表示空白区域数据保证不出现多余的空白行或者空白列。
Output
对于每一组数据给出一行输出输出摆放的方案数目C 数据保证C2^31。
Sample
InputcopyOutputcopy 2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -12
1 #includeiostream using namespace std; char a[100][100]; int n,k,dp[100],sum0; void dfs(int d,int k){//1 4 if(k0){ sum; return; } for(int id;in;i){ for(int j1;jn;j){ if(a[i][j].||dp[j]1){ continue; } dp[j]1; dfs(i1,k-1); dp[j]0; } } } int main(){ while(scanf(%d%d,n,k)){ if(n-1k-1)return 0; for(int i1;in;i){ dp[i]0; for(int j1;jn;j){ cina[i][j]; } } sum0; dfs(1,k); coutsumendl; } return 0; }