原创


之前用了枚举法解炸弹人,题目详情请看我之前的博客:https://www.cnblogs.com/chiweiming/p/9295262.html

利用枚举法是无视地图布局的,枚举法直接全局搜索地图,一遇到空地就从4个方向统计敌人数目,但是有些空地

被敌人所包围,炸弹人是无法进去的,而这些被敌人包围的点若是能炸死敌人最多的点则结果救就会错误,所以可

以先用广度优先搜索(DFS也可以)搜索出哪些点炸弹人可以到达,然后在可到达的点的基础上统计可炸死敌人数。

不熟悉BFS算法请看我博客:https://www.cnblogs.com/chiweiming/p/9337316.html

Java:

import java.util.*;

public class bomb_Two {

    static int n;    //行
static int m; //列
static char maze[][]; //存储地图
static int book[][]; //标记
static int x[]; //队列横坐标
static int y[]; //队列纵坐标
static int step[]; //步数
static int max=0; //存储最大敌人数
static int save_x; //存储目标横坐标
static int save_y; //存储目标纵坐标 static void Totall(int x,int y) { //统计可消灭敌人数 int total=0;
int dx=x;
int dy=y;
while(maze[dx][dy]!='#') { //右
if(maze[dx][dy]=='G') {
total++;
}
dy++;
}
dx=x;
dy=y;
while(maze[dx][dy]!='#') { //下
if(maze[dx][dy]=='G') {
total++;
}
dx++;
}
dx=x;
dy=y;
while(maze[dx][dy]!='#') { //左
if(maze[dx][dy]=='G') {
total++;
}
dy--;
}
dx=x;
dy=y;
while(maze[dx][dy]!='#') { //上
if(maze[dx][dy]=='G') {
total++;
}
dx--;
}
if(total>max) {
save_x=x;
save_y=y;
max=total;
}
} public static void main(String[] args) { Scanner reader=new Scanner(System.in);
n=reader.nextInt();
m=reader.nextInt();
int start_x=reader.nextInt(); //炸弹人初始位置
int start_y=reader.nextInt();
x=new int[n*m];
y=new int[n*m];
step=new int[n*m];
int dir[][]= {{0,1},{1,0},{0,-1},{-1,0}}; //右、下、左、上
int head=0; //头结点
int tail=0; //尾结点
maze=new char[n][m];
book=new int[n][m];
for(int i=0;i<n;i++) {
String ss=reader.next();
maze[i]=ss.toCharArray();
}
for(int i=0;i<n;i++) { //标记数组初始化
for(int j=0;j<m;j++) {
book[i][j]=0;
}
}
Totall(start_x,start_y); //统计初始位置可灭敌数
//初始位置入队列
x[tail]=start_x;
y[tail]=start_y;
step[tail]=0;
book[start_x][start_y]=1;
tail++; //尾指针后移
while(head<=tail) {
for(int i=0;i<4;i++) {
int dx=x[head]+dir[i][0];
int dy=y[head]+dir[i][1];
if(dx<0 || dx>n || dy<0 || dy>m) { //越界判断
continue;
}
if(maze[dx][dy]!='.' || book[dx][dy]==1) { //障碍点和空地判断
continue;
}
//符合条件
x[tail]=dx;
y[tail]=dy;
step[tail]=step[head]+1;
book[dx][dy]=1;
tail++;
Totall(dx,dy); //统计敌人数
}
head++; //出队列
}
System.out.println("("+save_x+","+save_y+")"+" "+max);
} }

12:07:58

2018-07-20

再解炸弹人——BFS的更多相关文章

  1. 再解炸弹人,dfs&bfs

    输入样例: 13 13 3 3##############GG.GGG#GGG.####.#G#G#G#G##.......#..G##G#.###.#G#G##GG.GGG.#.GG##G#.#G# ...

  2. 三解炸弹人——DFS

    原创 枚举解炸弹人—— https://www.cnblogs.com/chiweiming/p/9295262.html BFS解炸弹人—— https://www.cnblogs.com/chiw ...

  3. Jenkins通过FTP上传站点太多文件导致太慢且不稳定,切换为压包上传再解压的思路(asp.net)

    在本地先处理好要上传的站点文件之后,可能会因为一些网页切图导致ftp上传不稳定,中断,或者文件占用的问题. 那么换了一种实现思路,要借助jenkins的工具jenkins-cli.jar. 解决思路: ...

  4. 工控安全入门(三)—— 再解S7comm

    之前的文章我们都是在ctf的基础上学习工控协议知识的,显然这样对于S7comm的认识还不够深刻,这次就做一个实战补全,看看S7comm还有哪些值得我们深挖的地方. 本篇是对S7comm的补全和实战,阅 ...

  5. Vijos 1206 CoVH之再破难关 [BFS] [位运算]

    1.题意:一个由01组成的4*4的矩阵,可以实现相邻元素交换位置的操作,给出初试状态和目标状态,试求最少操作数的方案: 2.输入输出:输入给出初试矩阵和目标矩阵:要求输出最小操作的次数: 3.分析:输 ...

  6. 再解java中的String

    今天看到一篇文章中,写了关于java中的String.我看了后,是我从学java来觉得是最好的一篇关于String类的文章.看了这篇文章你就会对String的认识会提高一个层次.故将原作者的文章特意转 ...

  7. Django ORM中使用update_or_create功能再解

    以前,我解过这个问题,现在百度搜索,发了像也只能找到我这个帖子. https://www.cnblogs.com/aguncn/p/4922654.html 今天,看了看官方文档,关于这个update ...

  8. KMP算法再解 (看毛片算法真是人如其名,哦不,法如其名。)

    KMP算法主要解决字符串匹配问题,其中失配数组next很关键: 看毛片算法真是人如其名,哦不,法如其名. 看了这篇博客,转载过来看一波: 原博客地址:https://blog.csdn.net/sta ...

  9. this指针再解

     this.new.call和apply的相关问题 讲解this指针的原理是个很复杂的问题,如果我们从javascript里this的实现机制来说明this,很多朋友可能会越来越糊涂,因此本篇打算换一 ...

随机推荐

  1. php时间 显示刚刚 几分钟前等

    功能示例: $now = time();foreach($sys_res as $k => $v){ $day = intval(floor(($now - $v->system_time ...

  2. laravel中好用的支付安装包

    是包括支付宝和微信的支付 准用包,在测试中 https://github.com/yansongda/laravel-pay 这个包,看上去很好但是composer require时,要求php太高, ...

  3. C语言回调函数详解

    1. 什么是回调函数? 回调函数,光听名字就比普通函数要高大上一些,那到底什么是回调函数呢?恕我读得书少,没有在那本书上看到关于回调函数的定义.我在百度上搜了一下,发现众说纷纭,有很大一部分都是使用类 ...

  4. DHCP(四)

    确认阶段:即DHCP服务器确认分配级DHCP客户端IP地址的阶段.某个DHCP服务器在收到DHCP客户端发来的DHCP Request报文后,只有DHCP客户端选择的服务器会进行如下操作:如果确认将地 ...

  5. linux启动自动挂载分区和/etc/fstab简单修复

    让后加的分区能够启动时自动挂载,需要把配置写入文件 /etc/fstab vi /etc/fstab UUID=3f5859e0-592f-42cd-b533-570422fb85be   / ext ...

  6. BROCADE交换机配置

    BROCADE交换机配置一 与交换机交互,可以使用三种方式: 串口 以太网口 光纤口 缺省的串口参数是:9600,N,8,1 缺省IP访问方式是: IP地址: 10.77.77.77 用户名: adm ...

  7. 【转】Jmeter笔记:响应断言详解

    平时我们使用jmeter进行性能测试时,经常会用到断言.jmeter提供了很多种断言,本来想全都写一下,但发现每一个断言里面的东西都很多,所以就先写一下我们经常使用的响应断言. 第一次在cnblog上 ...

  8. java图形用户界面练习。j2se

    总结:主要是如何布局.还是存在很大问题 package clientFrame; import java.awt.FlowLayout; import javax.swing.JButton; imp ...

  9. Tair ldb(leveldb存储引擎)实现介绍

    简介 tair 是淘宝自己开发的一个分布式 key/value 存储引擎. tair 分为持久化和非持久化两种使用方式. 非持久化的 tair 可以看成是一个分布式缓存. 持久化的 tair 将数据存 ...

  10. Android BindService中遇到的一个小问题

    今天在使用BindService的时候遇到个小问题,我希望通过Bindservice获取到这个服务,然后执行服务内的某个自定义方法,如下: if(bindService==null){ Intent ...