POJ 1321 棋盘问题

题目地址 : https://vjudge.net/problem/POJ-1321

棋盘问题
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 74389   Accepted: 35102

Description

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放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

 1 #include<iostream>
 2 
 3 using namespace std;
 4 char chessboard[10][10];     //记录棋盘位置
 5 int visited[10];        //记录一列是否已经放过棋子
 6 int n, k;
 7 int ways, num;    //ways 是放棋子的方案数 ,num是已放入棋盘的棋子数目
 8 
 9 void dfs(int cur)    //搜索第cur行
10 {
11     if (num == k)
12     {
13         ways++;
14         return;
15     }
16     if (cur >= n)    //边界
17         return;
18 
19     for (int j = 0; j<n; j++)
20         if (!visited[j] && chessboard[cur][j] == '#')  //判断条件
21         {
22             visited[j] = 1;           //标记
23             num++;
24             dfs(cur + 1);
25             visited[j] = 0;           //改回来方便下一行的判断
26             num--;
27         }
28     dfs(cur + 1);                //到下一行
29 }
30 
31 int main()
32 {
33     while (1) 
34     {
35         ways = 0;
36         num = 0;
37         cin >> n >> k;
38         if (n == -1 && k == -1)
39             break;
40 
41         for (int i = 0; i < n; ++i)
42             for (int j = 0; j < n; ++j)
43                 cin >> chessboard[i][j];
44 
45         for (int i = 0; i < 10; ++i)
46             visited[i] = 0;        //访问状态置零
47 
48 
49         dfs(0);        //从第零行开始搜索
50         cout << ways << endl;
51     }
52     return 0;
53 }
原文地址:https://www.cnblogs.com/FengZeng666/p/10383512.html