炸弹人游戏_暴力枚举

来源:互联网 发布:四川禄宏微交易 知乎 编辑:程序博客网 时间:2024/05/17 08:09
先来说说题目意思吧,如图,帮助小人找到一个放炸弹的坐标,使之一颗炸弹炸死最多的敌人。
炸弹人题目示意图

我们用字符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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 欧灵平板电脑忘记图密解锁怎么办 淘宝没货发给人被投诉了怎么办 淘宝店铺既不能开又不能注销怎么办 妻子被骗五万疑似被洗脑我该怎么办 奖虫账号和密码不匹配怎么办 开淘宝店余额宝里的钱怎么办 京东找不到所有宝贝的链接了怎么办 淘宝店链接改了标题没流量怎么办 淘宝手淘搜索自然流量少怎么办 4个月宝贝不食欲下降怎么办 淘宝商家预售时间到了不发货怎么办 淘宝修改类目被处置管控了怎么办 淘宝换手机号是已经注册了的怎么办 闲鱼违规把我淘宝店铺冻结了怎么办 开网店店主想买自己的东西怎么办 以前用微博登录头条的账号怎么办 公众号注册提示邮箱已被占用怎么办 学信网注册时出现邮箱被占用怎么办 手机淘宝店铺接不到买家消息怎么办 买了东西淘宝店铺没了怎么办 淘宝店铺直播间虚假交易违规怎么办 手机淘宝退款物流单号填错了怎么办 淘宝评价删除了卖家没有返现怎么办 想摆摊卖麻辣烫不知怎么摆怎么办 在淘宝卖东西买家退款不退货怎么办 在闲鱼网上买东西被骗了怎么办 开通花呗的手机号不用了怎么办 饿了么开业第一天没单量怎么办 淘宝新开店铺没有人来呀怎么办 刚开的淘宝店铺没有人买东西怎么办 开了一家龙虾店生意很淡怎么办? 新买的皮质小白鞋有点板脚怎么办 手机无效安装包与系统不兼容怎么办 发好的海参放进速冻后变小了怎么办 厨房地砖下面的下水管漏水怎么办? 埋在地下的暖气管漏水怎么办 安装个视频播放器视频全没了怎么办 奇迹mu圣导转职任务打不过怎么办 丈夫死后房产证过给妻子怎么办 学业与志愿活动冲突时你会怎么办 往宅正门前面有半园幕墙玻璃怎么办