棋盘问题

描述

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

输入

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

输出

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

样例输入

1
2
3
4
5
6
7
8
9
2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1

样例输出

1
2
2
1

代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39

#include <iostream>

using namespace std;

long cal(char map[][9], int col[], int row[], int n, int k, int i){
if (k == 0){
return 1;
}
long res = 0;
for (int a = i; a <= n - k; a ++){
for (int b = 0; b < n; b ++){
if (map[a][b] == '#' && col[a] != 1 && row[b] != 1){
col[a] = 1;
row[b] = 1;
res += cal(map, col, row, n, k - 1, a + 1);
col[a] = 0;
row[b] = 0;
}
}
}
return res;
}

int main(void){
char map[9][9];
int n, k;
cin >> n >> k;
while(n != -1 && k != -1){
for(int i = 0; i < n; i++){
cin >> map[i];
}
int col[8] = {0};
int row[8] = {0};
cout << cal(map, col, row, n, k, 0) << endl;
cin >> n >> k;
}

}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×