三解炸弹人——DFS
2024-08-29 00:04:47
原创
枚举解炸弹人—— https://www.cnblogs.com/chiweiming/p/9295262.html
BFS解炸弹人—— https://www.cnblogs.com/chiweiming/p/9338597.html
关于题目的介绍请看枚举解炸弹人。
由于枚举存在漏洞,所以采用BFS或者DFS来解题。
此篇博客用DFS解炸弹人,不管是DFS还是BFS都是通过这两种算法的全局搜索功能搜索出地图上的每个点,
再在搜索的基础上逐个点统计出敌人数即可。
Java
import java.util.*; public class bomb_Three { static int n; //行
static int m; //列
static int save_x;
static int save_y;
static int max=0;
static int dir[][]= {{0,1},{1,0},{0,-1},{-1,0}}; //右、下、左、上
static char maze[][];
static int book[][]; //标记数组 static void Total(int x,int y) { //统计灭敌数 int dx=x;
int dy=y;
int num=0;
while(maze[dx][dy]!='#') { //右
if(maze[dx][dy]=='G') {
num++;
}
dy++;
}
dx=x;
dy=y;
while(maze[dx][dy]!='#') { //下
if(maze[dx][dy]=='G') {
num++;
}
dx++;
}
dx=x;
dy=y;
while(maze[dx][dy]!='#') { //左
if(maze[dx][dy]=='G') {
num++;
}
dy--;
}
dx=x;
dy=y;
while(maze[dx][dy]!='#') { //上
if(maze[dx][dy]=='G') {
num++;
}
dx--;
}
if(num>max) {
max=num;
save_x=x;
save_y=y;
} } static void DFS(int x,int y) { for(int i=0;i<4;i++) {
int dx=x+dir[i][0];
int dy=y+dir[i][1];
if(dx<0 || dx>n || dy<0 || dy>m) {
continue;
}
if(maze[dx][dy]!='.' || book[dx][dy]==1) {
continue;
}
Total(dx,dy);
book[dx][dy]=1;
DFS(dx,dy);
// book[dx][dy]=0; //这里别回溯
} } public static void main(String[] args) { Scanner reader=new Scanner(System.in);
n=reader.nextInt();
m=reader.nextInt();
maze=new char[n][m];
book=new int[n][m];
int start_x=reader.nextInt(); //炸弹人初始位置
int start_y=reader.nextInt();
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;
}
}
Total(start_x,start_y);
DFS(start_x,start_y);
System.out.println("("+save_x+","+save_y+")"+" "+max);
} }
测试用例:
输入:
13 13 3 3
#############
#GG.GGG#GGG.#
###.#G#G#G#G#
#.......#..G#
#G#.###.#G#G#
#GG.GGG.#.GG#
#G#.#G#.#.#.#
##G...G.....#
#G#.#G###.#G#
#...G#GGG.GG#
#G#.#G#G#.#G#
#GG.GGG#G.GG#
#############
输出:
(7,11) 10
16:06:30
2018-07-20
最新文章
- AMD and CMD are dead之KMDjs集成Blob一键下载全部build包
- php简单单例模式
- datatables笔记
- Java基础(10):java基础第一部分综合测试题,成绩合法性校验与排序
- java学习之(内部类)
- (bug更正)利用KVC和associative特性在NSObject中存储键值
- asp.net微信开发第五篇----用户分组管理
- 使用john破解ubuntu(linux)9.10密码
- Linux 时间同步配置(转)
- uboot: 理解uboot要看哪些书
- Android 文字绘制(DrawText)技术总结
- 引入Log4j
- Oracle单机Rman笔记[5]---脱机异地还原
- HttpWebRequest post 请求超时问题
- 解决Linux下IDEA无法使用ibus输入法的问题和tip乱码
- Airmon-ng抓包&;破解wifi
- PHP Lavavel 使用控制器 传递变量 以及调用 视图模板
- Maven构建时跳过部分测试
- 循环队列的C语言实现
- 数据库客户端快捷键(oracle+sybase)
热门文章
- Restore Nexus 5 to Stock and Flash Factory Images
- erlang 应用获取系统参数
- composer.phar的作用和安装laravel5.5.4 和 vendor目录
- cvc-complex-type.2.4.a: Invalid content was found starting with element &#39;async-supported&#39;
- 常用hash算法及评测[转]
- appium控制Android按键
- 1108 Finding Average
- JavaScript笔记——基础知识(一)
- Oracle11gR2--静默安装数据库软件
- zookeeper java api(使用java代码操作zookeeper)