简单的深度优先搜索HDU1045
来源:互联网 发布:荒野猎人 知乎 编辑:程序博客网 时间:2024/05/29 18:48
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1045
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=2
题目:类似八皇后问题,图中黑框表示墙,空白表示空,可以摆放炮台,炮台可以攻击同排和同列没有墙隔开的其它炮台,所以两个炮台不能裸露地放在同一排或者同一列.但是,如果中间隔着墙,则可以,我们的目标是使得地图上放上尽可能多的炮台,并且求出最大炮台数量.
思路:这个题目和八皇后唯一的不同点就是炮台并不攻击对角线,但是却有可能摆放在同一排或者同一列,如果中间隔着墙.题目还是比较有意思的.因为地图最大规模只有4*4,所以完全可以用暴力搜索的办法.用DFS可以解决这个问题,对n*n个格子都判断一遍,如果满足条件,就尝试着摆放在这个位置,当把所有可能摆放的可能性都列举出来的时候,就可以统计出哪种摆放可以使得炮台数最多了.中间需要一个辅助的子函数IsCanPut(x,y)
当前位置可以放置炮台的条件是
case1:当前点不是墙,case2:当前点和之前已经排放的炮台不在同行或者同列出现冲突(即无墙隔开)
#include<iostream>#include<limits.h>using namespace std;int Maxn,n;char map[5][5];bool isCanPut(int x,int y){if(map[x][y]=='X')return false ;//can't put in this placeint i,j;for(i=x-1;i>=0;--i){if( map[i][y]=='X') break; //if there is a wall,would be okif(map[i][y] == 'o')//this rows exist an bombreturn false;}for(j=y-1;j>=0;--j){if( map[x][j]=='X')break;if( map[x][j]=='o')return false;}return true;}void DFS(int num,int Index)//num表示炮台数,Index表示当前索引{if( Index == n*n ){if(num > Maxn)Maxn=num;}else{int x=Index / n;int y=Index % n;if( isCanPut(x,y)){map[x][y]='o';//puta bomb on this placeDFS(num+1,Index+1);//search next one,and num add 1map[x][y]='.' ; //recover out place}DFS(num,Index+1);}}int main(){while(cin>>n && n!=0){int i,j;Maxn=INT_MIN;for( i=0;i<n;++i)for(j=0;j<n;++j)cin>>map[i][j];DFS(0,0);//初始状态炮台数,索引都为0cout<<Maxn<<endl;}}
- 简单的深度优先搜索HDU1045
- 简单深度优先搜索
- 深度优先搜索简单入门
- pku 1164 解题报告 简单的深度优先搜索
- 深度优先搜索和深度优先搜索的区别
- 图的深度优先搜索
- 图的深度优先搜索
- 图的深度优先搜索
- 图的深度优先搜索
- 深度优先搜索的实现
- 图的深度优先搜索
- 图的深度优先搜索
- 邻接矩阵的深度优先搜索
- 图的深度优先搜索
- 图的深度优先搜索
- 深度优先搜索的学习
- 图的深度优先搜索
- 图的深度优先搜索
- SparseArray in Android
- fastboot相关
- securecrt, xshell中menuconfig乱码解决方法
- wamp server配置服务器
- 寻找两个链表的第一个交点-微策略
- 简单的深度优先搜索HDU1045
- win7之GetPrivateProfileStringW和WritePrivateProfileStringW访问C:\\ProgramFiles\\目录下文件权限不足问题
- 函数调用入栈基本步骤(感觉和进程的栈帧结构一块看会比较容易理解)
- A *寻路算法
- JSP自定义标签(三) 多选控件(3)
- JAX-RS
- 科鲁兹掀背车1.6T 流动的魅力
- 计算机网络笔记(第一章)
- 查看python已经安装的模块