POJ1321棋盘问题

题目:

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

输入:

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

输出:

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

样例:

分析:及AC代码如下

 1 #include<iostream>
 2 #include<sstream>
 3 #include<cstdio>
 4 #include<string>
 5 #include<cstring>
 6 #include<algorithm>
 7 #include<functional>
 8 #include<iomanip>
 9 #include<numeric>
10 #include<cmath>
11 #include<queue>
12 #include<vector>
13 #include<set>
14 #include<cctype>
15 #define PI acos(-1.0)
16 const int INF = 0x3f3f3f;
17 const int NINF = -INF - 1;
18 typedef long long ll;
19 using namespace std;
20 int n, k, num;//记录答案
21 int used[10];//记录此列已经被使用
22 int judge[10][10];//记录此格是否为棋盘区域
23 char c[10][10];//记录棋盘
24 void func(int x, int y, int t)//t记录当前已有几个棋子
25 {
26     if (t == k)
27     {
28         //cout << x << ' ' << y << ' ' << t << endl;
29         num++;
30         return;
31     }
32     for (int i = x + 1; i < n; ++i)//每次从下一行开始搜索
33     {
34         for (int j = 0; j < n; ++j)
35         {
36             if (judge[i][j] && !used[j])
37             {
38                 //cout << i << ' ' << j << ' ' << t << endl;
39                 used[j] = 1;
40                 func(i, j, t + 1);
41                 used[j] = 0;//完成后复位
42             }
43         }
44     }
45 }
46 int main()
47 {
48     while (cin >> n >> k)
49     {
50         if (n == -1 && k == -1) break;
51         num = 0;//初始化
52         memset(used, 0, sizeof(used));
53         memset(judge, 0, sizeof(judge));
54         for (int i = 0; i < n; ++i)
55         {
56             for (int j = 0; j < n; ++j)
57             {
58                 cin >> c[i][j];
59                 if (c[i][j] == '#') judge[i][j] = 1;//记录该格为棋盘区域
60             }
61         }
62         func(-1, 0, 0);//x=-1,第一次即从0开始(i=x+1)
63         cout << num << endl;
64     }
65     return 0;
66 }

  

常常因身处温室而不自知,因而懈怠; 及时当勉励,岁月不待人!
原文地址:https://www.cnblogs.com/veasky/p/10970664.html