1217:棋盘问题

题目来源:http://ybt.ssoier.cn:8088/problem_show.php?pid=1217

1217:棋盘问题


时间限制: 1000 ms         内存限制: 65536 KB
提交数: 3207     通过数: 1502 

【题目描述】

在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放 k 个棋子的所有可行的摆放方案 C。

【输入】

输入含有多组测试数据。

每组数据的第一行是两个正整数n,k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 (n8,kn)

当为1 1时表示输入结束。

随后的n行描述了棋盘的形状:每行有n个字符,其中 #表示棋盘区域,.表示空白区域(数据保证不出现多余的空白行或者空白列)。

【输出】

对于每一组数据,给出一行输出,输出摆放的方案数目CC(数据保证C<231C<231)。

【输入样例】

2 1
#.
.#
4 4
...#
..#.
.#..
#...
-1 -1

【输出样例

2
1

解析:
这是一道八皇后的变式题,具体来讲就是不默认棋子数,不默认棋盘大小和形状,因此我们必须考虑到可放置棋子的数量与行数的关系,若照搬八皇后的解法,是无法搜索到整张棋盘的。
故,将其具体分析,得知我们需要让每次放置方法的起始行递增,直到搜索完整张棋盘。其他还是和八皇后没太大区别。
参考代码:
 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<algorithm>
 6 #include<string>
 7 #include<cstdlib>
 8 #include<queue>
 9 #include<vector>
10 #define INF 0x3f3f3f3f
11 #define PI acos(-1.0)
12 #define N 101
13 #define MOD 2520
14 #define E 1e-12
15 using namespace std;
16 int l[10],n,k,ans=0,a[10][10];// l判断列上是否有棋子,a储存棋盘 
17 char c;
18 void dfs(int x,int step)//x当前行,step当前放置棋子数 
19 {
20     if(step==k) ans++;
21     else
22     for(int i=x;i<n;i++)//从x行开始搜索下面的剩余棋盘,以得到整张棋盘的解 
23      for(int j=0;j<n;j++)
24      {
25          if(l[j]==0&&a[i][j]==1)
26          {
27              l[j]=1;
28              dfs(i+1,step+1);
29             l[j]=0;
30         }
31      }
32 }
33 int main()
34 {
35     do
36     {
37         memset(l,0,sizeof(l));
38         memset(a,0,sizeof(a));
39         ans=0;
40         scanf("%d%d",&n,&k);
41         if(n==-1&&k==-1) break;
42         for(int i=0;i<n;i++)
43         {
44             for(int j=0;j<n;j++)
45              {
46                  cin>>c;
47                  if(c=='#') a[i][j]=1;
48                  else a[i][j]=0;
49             }
50         }
51         dfs(0,0);
52         printf("%d
",ans);
53     }while(n!=-1&&k!=-1);
54     return 0;
55 }

2019-03-24 00:23:55

 
原文地址:https://www.cnblogs.com/DarkValkyrie/p/10586610.html