poj1321——棋盘问题
来源:互联网 发布:手机淘宝购物流程 编辑:程序博客网 时间:2024/06/15 20:25
题目大意:在一个给定形状的棋盘(形状可能是不规则的)上面摆放棋子,棋子没有区别。要求摆放时任意的两个棋子不能放在棋盘中的同一行或者同一列,问摆放k个棋子的所有可行的摆放方案个数。
输入:(多个case)
棋盘行列数n 棋子个数k(-1 -1表示结束,n<=8,k<=n)
棋盘第i行形状(#表示棋盘区域 .表示空白区域)
输出:摆放方案个数
分析:深度优先搜索,与八皇后类似,但是只限制了行列不冲突,dfs第i层,看哪一列能摆放棋子。
代码:转载自http://blog.csdn.net/acmer_sly/article/details/52494797
- #include<stdio.h>
- #include<string.h>
- int n,k;
- char map[10][10];
- int vis[10];
- int count;
- void Dfs(int index,int num)
- {
- if(index>=n&&num!=0)return;
- if(num>n-index)return; //一个剪枝,即如果剩下的行数<剩下的棋子数,
- // 那这种方案肯定不行,就直接return结束
- if(num==0){ //棋子按要求放完了,即又找到了一种方案
- count++;
- return;
- }
- int i;
- for(i=0;i<n;i++){
- if(map[index][i]=='.')continue;
- if(vis[i])continue;
- vis[i]=1; //标记列
- Dfs(index+1,num-1); //表示这一行要放棋子
- vis[i]=0;
- }
- Dfs(index+1,num); //表示这一行不放棋子
- }
- int main()
- {
- int i;
- while(scanf("%d %d",&n,&k)!=EOF){
- if(n==-1&&k==-1)break;
- count=0;
- for(i=0;i<n;i++){
- scanf("%s",map[i]);
- }
- memset(vis,0,sizeof(vis));
- Dfs(0,k);
- printf("%d\n",count);
- }
- return 0;
- }
阅读全文
0 0
- poj1321——棋盘问题
- POJ1321——棋盘问题
- POJ1321——棋盘问题
- poj1321——棋盘问题
- poj1321——棋盘问题(DFS)
- POJ1321 棋盘问题 —— DFS回溯
- poj1321棋盘问题
- poj1321 棋盘问题
- poj1321(dfs棋盘问题)
- poj1321 - 棋盘问题
- poj1321棋盘问题
- POJ1321--棋盘问题
- POJ1321( 棋盘问题)
- POJ1321:棋盘问题
- poj1321 棋盘问题
- poj1321棋盘问题
- poj1321棋盘问题{wa}
- poj1321 棋盘问题 dfs
- 剑指offer——面试题23:从上往下打印二叉树
- rpm、yum工具用法 & 配置本地yum仓库
- Profile配置
- 第十周,题目:定义一个图形类及其子类(三角形类和矩形类),分别计算其面积和周长。
- SI3.5注册码
- poj1321——棋盘问题
- 杭电 1019 Least Common Multiple
- VR---虚拟现实
- MyEclipse2016破解过程
- COW写时拷贝---快照
- 1038. 统计同成绩学生(20)
- HDU-1087 Super Jumping! Jumping! Jumping! (线性dp 上升子序列最大和)
- 使用yum在CentOS下安装Nginx服务器
- ActiveMQ点对点模式(PTP)