poj1321(深度优先搜索)

棋盘问题
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 15594   Accepted: 7709

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

Source

 
源代码:
 1 #include<iostream>
 2 #include<cstring>
 3 using namespace std;
 4 
 5 char map[9][9];
 6 int vis[9], num;
 7 
 8 void DFS(int n, int r, int k)
 9 {
10     if(k==0)
11     {
12         num++;
13         return;
14     }
15     if(n-r<k) return;
16     for(int i=0; i<n; i++)
17     {
18         if(map[i][r]=='#' && vis[i]==0)
19         {
20             vis[i] = 1;
21             DFS(n, r+1, k-1);
22             vis[i] = 0;
23         }
24     }
25     DFS(n, r+1, k);
26 }
27 
28 int main()
29 {
30     int n,k;
31     while(cin>>n>>k)
32     {
33         num = 0;
34         if(n==-1&&k==-1) break;
35         memset(vis, 0, sizeof(vis));
36         for(int i=0; i<n; i++)
37         cin>>map[i];
38         DFS(n,0,k);
39         cout<<num<<endl;
40     }
41     return 0;
42 }

 

posted @ 2012-08-12 10:48  itersky  阅读(225)  评论(0编辑  收藏  举报