炸弹人游戏_暴力枚举
2016-03-10 11:03
309 查看
先来说说题目意思吧,如图,帮助小人找到一个放炸弹的坐标,使之一颗炸弹炸死最多的敌人。
![](http://www.myexception.cn/img/2015/04/24/215252634.png)
我们用字符G表示敌人,#表示墙, . 表示可以走的路,特别说明下,那种一推就倒的墙,就把它看做路吧。
BFS:
DFS:
![](http://www.myexception.cn/img/2015/04/24/215252634.png)
我们用字符G表示敌人,#表示墙, . 表示可以走的路,特别说明下,那种一推就倒的墙,就把它看做路吧。
BFS:
#include<iostream> using namespace std; struct note { int x;//横坐标 int y;//纵坐标 }; struct note que[401]; int book[20][20]; int i,j,k,sum,maxs=0,mx,my,n,m,startx,starty,tx,ty; int next[4][2]={{0,1}, {1,0}, {0,-1}, {-1,0}}; char a[20][21];//用来存储地图 int getnum(int i,int j) { int sum,x,y; sum=0;//记录可以消灭敌人的个数 //将坐标i,j复制到两个变量x,y中,保存初始坐标i,j; x=i; y=j; while(a[x][y]!='#') { if(a[x][y]=='G') sum++; x--;//继续向下 } x=i; y=j; while(a[x][y]!='#') { if(a[x][y]=='G') sum++; x++;//继续向下 } x=i; y=j; while(a[x][y]!='#') { if(a[x][y]=='G') sum++; y--;//继续向左 } x=i; y=j; while(a[x][y]!='#') { if(a[x][y]=='G') sum++; y++;//继续向右 } return sum; } void bfs() { int head=1; int tail=1; que[tail].x=startx; que[tail].y=starty; tail++; book[startx][starty]=1; maxs=getnum(startx,starty); mx=startx; my=starty; while(head<tail) { for(k=0;k<=3;k++) { tx=que[head].x+next[k][0]; ty=que[head].y+next[k][1]; if(tx<0||tx>n-1||ty<0||ty>m-1) continue; if(a[tx][ty]=='.'&&book[tx][ty]==0) { book[tx][ty]=1; que[tail].x=tx; que[tail].y=ty; tail++; sum=getnum(tx,ty); if(sum>maxs) { maxs=sum; mx=tx; my=ty; } } } head++; } } int main() { cin>>n>>m>>startx>>starty; for(i=0;i<=n-1;i++) cin>>a[i]; cout<<sum<<endl; return 0; }
DFS:
#include<cstdio> #include<iostream> using namespace std; char a[20][21],book[20][20]; int mx,my,n,m,maxs; int next[4][2]={{0,1}, {1,0}, {0,-1}, {-1,0}}; int getnum(int i,int j) { int sum,x,y; sum=0; x = i;y = j; //记录初始的搜索点i,j while ( a[x][y]!='#') { if ( a[x][y] == 'G' ) sum++; x++; //从初始搜索点向下 搜索 } x = i;y = j; //记录初始的搜索点i,j while ( a[x][y]!='#' ) { if ( a[x][y] == 'G' ) sum++; x--; //从初始搜索点向上搜索 } x = i;y = j; //记录初始的搜索点i,j while ( a[x][y]!='#' ) { if ( a[x][y] == 'G' ) sum++; y--; //从初始搜索点向左搜索 } x = i;y = j; //记录初始的搜索点i,j while ( a[x][y]!='#' ) { if ( a[x][y] == 'G' ) sum++; y++; //从初始搜索点向右搜索 } return sum; } void dfs(int x,int y) { int h,sum,tx,ty; sum=getnum(x,y); if(sum>maxs) { maxs=sum; mx=x; my=y; } for(h=0;h<=3;h++) { //计算下一个点坐标 tx=x+next[h][0]; ty=y+next[h][1]; //判断是否越界 if(tx<1||tx>n||ty<1||ty>n) continue; //判断是否是障碍物或者已经在路径中 if(a[tx][ty]=='.'&&book[tx][ty]==0) { //把这个点标记为已经走过 //注意宽带搜索每个点只能入队列一次 ,和dfs不同,所以book的值不需要恢复为0; book[tx][ty]=1; //插入新的点到队列中 dfs(tx,ty); //因为放炸弹炸死的人数,不需要返回,我们只需要遍历每一个点,求得在每一个点炸死的人数。 //所以这里没有循环终止条件,return 直接不需要,book[tx][ty]=0; 也不需要恢复。 } } } int main(void) { int i,startx,starty; cin>>n>>m>>startx>>starty; for ( int i = 0;i <n;i++ ) cin>>a[i]; book[startx][starty]=1; maxs=getnum(startx,starty); mx=startx; my=starty; dfs(startx,starty); cout<<mx<<","<<my<<","<<n<<endl; return 0; }
相关文章推荐
- oracle数据误删恢复
- ALGO-86 矩阵乘法
- 在Hibernate中Query的uniqueResult查询和Result查询有什么区别
- 限制EditText 输入的字节数
- 从零开始学Linux[二]:日常操作
- PHP图片压缩
- centos6.5搭建GIT服务器
- [置顶] 学习JAVA之路(一、概述)
- 如何正确合理的建立MYSQL数据库索引
- Subversion error: Repository moved permanently to please relocate 解决方法
- 旋转数组的最小数字
- Matplotlib 画柱状图等
- linux线程同步之读写锁
- c++模板
- listView键盘弹出
- 第1次上机实验-1
- 【3.10】matlab中批量读取图像
- 通流能力计算
- Erlang节点重启导致的incarnation问题(转)
- android service 生命周期