炸弹人游戏_暴力枚举
来源:互联网 发布:四川禄宏微交易 知乎 编辑:程序博客网 时间:2024/05/17 08:09
先来说说题目意思吧,如图,帮助小人找到一个放炸弹的坐标,使之一颗炸弹炸死最多的敌人。
DFS:
我们用字符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; }
0 0
- 炸弹人游戏_暴力枚举
- 炸弹人(暴力枚举)
- 炸弹人--枚举
- 炸弹人 枚举
- 炸弹人 游戏
- 啊哈!算法—枚举之炸弹人
- 2006_7_30炸弹人游戏开发日志
- 2007_08_30炸弹人游戏开发日志
- 深度优先搜索+解炸弹人游戏
- 计蒜客题库_模拟、循环、暴力枚举_循环数
- C#游戏开发之炸弹人游戏开发
- 积木游戏_纪中1440_暴力+预处理
- 数字游戏_纪中2032_暴力?
- 暴力枚举
- 暴力枚举?
- 暴力枚举
- 暴力枚举
- 暴力枚举
- Android Studip下SlidingMenu的使用总结
- 232. Implement Queue using Stacks
- Android设计模式—策略模式
- 临时表空间概念
- java资源摘录
- 炸弹人游戏_暴力枚举
- Ntrip协议相关(客户端软件或代码)
- GridLayoutManager高度无法设置为WRAP_CONTENT(Vertical情况下)
- 一个支持8~16人的小型网络游戏的编写
- Android中 Bitmap和Drawable相互转换的方法
- ExecutorService中submit和execute的区别
- C++实验1
- 新萝卜家园GHOST WIN7系统32,64位官方版下载
- mongodb丢失数据的原因剖析