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个字符,其中 # 表示棋盘区域, . 表示空白区域(数据保证不出现多余的空白行或者空白列)。
每组数据的第一行是两个正整数,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 }