POJ1321 搜索题解
棋盘问题
Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 12845 Accepted: 6344
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
类似于N皇后问题,但有所改动。
1 #include<iostream>
2 #include<cstdio>
3 #include<cstring>
4 using namespace std;
5 char maze[8][8];
6 bool x[8],y[8]; //x对应行,y对应列
7 long n,k,ans;
8 //枚举每一行,若可放置则标记此行,并进行下一轮搜索
9 void dfs(long marked,long lastline)
10 {
11 if(marked==k)
12 {
13 ans++;
14 return;
15 }
16 for(long i=lastline;i!=n;i++)
17 {
18 for(long j=0;j!=n;j++)
19 if((!x[i])&&(!y[j])&&maze[i][j]=='#')
20 {
21 x[i]=y[j]=true;
22 dfs(marked+1,i);
23 x[i]=y[j]=false;
24 }
25 }
26 }
27 int main(void)
28 {
29 scanf("%ld%ld",&n,&k);
30 while(n!=-1&&k!=-1)
31 {
32 for(long i=0;i!=n;i++)
33 scanf("%s",maze[i]);
34 memset(x,false,sizeof(x));
35 memset(y,false,sizeof(y));
36 ans=0;
37 dfs(0,0);
38 printf("%ld\n",ans);
39 scanf("%ld%ld",&n,&k);
40 }
41 return 0;
42 }
posted on 2011-10-29 21:02 SilVeRyELF 阅读(154) 评论(0) 收藏 举报
浙公网安备 33010602011771号