1217:棋盘问题
题目来源:http://ybt.ssoier.cn:8088/problem_show.php?pid=1217
1217:棋盘问题
时间限制: 1000 ms 内存限制: 65536 KB
提交数: 3207 通过数: 1502
【题目描述】
在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,请编程求解对于给定形状和大小的棋盘,摆放 k 个棋子的所有可行的摆放方案 C。
【输入】
输入含有多组测试数据。
每组数据的第一行是两个正整数n,k,用一个空格隔开,表示了将在一个n*n的矩阵内描述棋盘,以及摆放棋子的数目。 (n≤8,k≤n)
当为−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\n",ans); 53 }while(n!=-1&&k!=-1); 54 return 0; 55 }
2019-03-24 00:23:55