A - 棋盘问题 POJ - 1321
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放k个棋子的所有可行的摆放方案C。
Input
输入含有多组测试数据。
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
Output
每组数据的第一行是两个正整数,n k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 n <= 8 , k <= n
当为-1 -1时表示输入结束。
随后的n行描述了棋盘的形状:每行有n个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
对于每一组数据,给出一行输出,输出摆放的方案数目C (数据保证C<2^31)。
Sample Input
2 1 #. .# 4 4 ...# ..#. .#.. #... -1 -1Sample Output
2 1
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<set> 2 #include<map> 3 #include<cmath> 4 #include<queue> 5 #include<string> 6 #include<cstdio> 7 #include<cstring> 8 #include<sstream> 9 #include<cstdlib> 10 #include<cstring> 11 #include<sstream> 12 #include<iostream> 13 #include<algorithm> 14 15 using namespace std; 16 const int maxn = 10; 17 const int INF = 0x3f3f3f3f; 18 const int mod = 7; 19 typedef long long ll; 20 #define PI 3.1415927 21 22 char mp[maxn][maxn]; 23 int arr[maxn]; 24 int t, m, n; 25 int k; 26 int ans; 27 bool vis[maxn]; 28 void dfs(int x) 29 { 30 if(k == 0) 31 { 32 ++ans; 33 return; 34 } 35 else 36 { 37 for(int i = 0; i < n; ++i) 38 { 39 if(0<=x && x<n && mp[x][i] == '#' && !vis[i]) 40 { 41 vis[i] = true; 42 --k; 43 dfs(x+1); 44 ++k; 45 vis[i] = false; 46 } 47 } 48 if(x+1<n) 49 dfs(x+1); 50 } 51 } 52 int main() 53 { 54 while(~scanf("%d%d", &n, &k) && (n!=-1 && k!=-1)) 55 { 56 getchar(); 57 ans = 0; 58 memset(vis, 0, sizeof(vis)); 59 for(int i = 0; i < n; ++i) 60 { 61 gets(mp[i]); 62 } 63 dfs(0); 64 printf("%d\n", ans); 65 } 66 return 0; 67 }