POJ1321 棋盘问题

                                                                                        棋盘问题

Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 8895   Accepted: 4278

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 <cstdlib>
 2 #include <iostream>
 3 #include <cstdio>
 4 #include <algorithm>
 5 #include <string.h>
 6 #include <cmath>
 7 using namespace std;
 8 
 9 char map[10][10];
10 int c;
11 
12 int check(int n,int i)
13 {
14     int j;
15     for(j=1;j<=n;j++)
16     if(map[j][i]=='0')
17     return 0;
18     return 1;
19 }
20 
21 int dfs(int n,int num,int s)
22 {
23     int i,j,k;
24     
25     if(num==0)
26     {c++;return 1;}
27     if((n-s+1)<num)
28     return 0;
29     
30     
31     for(i=s;i<=n;i++)
32     for(j=1;j<=n;j++)
33     {
34                      if(map[i][j]!='#')
35                      continue;
36                      if(!check(i,j))
37                      continue;
38                      
39                      map[i][j]='0';
40                      dfs(n,num-1,i+1);
41                      map[i][j]='#';
42     }
43     
44     return 1;
45 }
46                      
47                      
48                      
49 
50 int main(int argc, char *argv[])
51 {//freopen("C:/Users/shp/Desktop/in.txt","r",stdin);
52  //freopen("C:/Users/shp/Desktop/out.txt","w",stdout);
53  int n,k,i,j;
54  while(scanf("%d%d",&n,&k)!=EOF)
55  {
56                  if((n==-1)&&(k==-1))
57                  break;
58                  getchar();
59                  for(i=1;i<=n;i++)
60                  {for(j=1;j<=n;j++)
61                  scanf("%c",&map[i][j]);
62                  getchar();
63                  }
64                  
65                  c=0;
66                  
67                  dfs(n,k,1);
68                  cout<<c<<endl;
69                  
70  }
71                  
72                  
73                  
74                  
75                  
76  
77    
78     system("PAUSE");
79     return EXIT_SUCCESS;
80 }
posted @ 2012-05-31 11:41  cseriscser  阅读(353)  评论(0编辑  收藏  举报