package com.xjj.Ah;
/*---枚举 + 深度搜索 ----炸弹人----
* 1. 炸弹能到达的地方最多能炸死的敌人数
* 2. 用枚举法来获得每个空格放置炸弹能炸死的敌人数,用深度搜索法来获得能达到的地方
* 3. 先沿着一个方向深度搜索,遇到墙,在将此点四个方向都遍历完就返回,
* 4. book[][] 标记是否已经遍历
*
* 5. 深度优先搜索关键:当下该怎么做,下一步与当下相同;
* 基本模型
* void dfs(int step)
* {
* 判断边界--return
* 尝试每一种可能
* for(int i = 1; i <= n; i++)
* {
* 继续下一步 dfs(step+1);
* }
* 返回
* }
* */
public class Ah_4_41 {
static int N = 13;
static int M = 13;
//标记是否已经遍历
int[][] book = new int[N][M];
//方向数组
int[][] dir = {{0,1},{1,0},{0,-1},{-1,0}};
int max = 0, X = 0, Y = 0;
//‘#’为墙,‘H’为空格,‘G’为敌人
static char[][] a = {{'#','#','#','#','#','#','#','#','#','#','#','#','#'},
{'#','G','G','H','G','G','G','#','G','G','G','H','#'},
{'#','#','#','H','#','G','#','G','#','G','#','G','#'},
{'#','H','H','H','H','H','H','H','#','H','H','G','#'},
{'#','G','#','H','#','#','#','H','#','G','#','G','#'},
{'#','G','G','H','G','G','G','H','#','H','G','G','#'},
{'#','G','#','H','#','G','#','H','#','H','#','H','#'},
{'#','#','G','H','H','H','G','H','H','H','H','H','#'},
{'#','G','#','H','#','G','#','#','#','H','#','G','#'},
{'#','H','H','H','G','#','G','G','G','H','G','G','#'},
{'#','G','#','H','#','G','#','G','#','H','#','G','#'},
{'#','G','G','H','G','G','G','#','G','H','G','G','#'},
{'#','#','#','#','#','#','#','#','#','#','#','#','#'},
};
//返回该点可炸死敌人的数目,枚举法
public int getNum(int i, int j){
int sum=0,x,y;
//向上统计
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;
}
//深度优先搜索
public void dfs(int x, int y){
//获得该点能炸死的敌人数
int sum = getNum(x, y);
//更新
if (sum > max) {
max = sum;
X = x;
Y = y;
}
//枚举四个方向,先从右开始,下左上
for(int k = 0; k <= 3; k++){
int tx = x + dir[k][0];
int ty = y + dir[k][1];
//判断是否越界
if (tx > N-1 || tx < 1 || ty > M-1 || ty < 1)
continue;
//如果为空格且未标记
if (a[tx][ty] == 'H' && book[tx][ty] == 0) {
book[tx][ty] = 1; //一定记得先标记,不然递归回进入死循环
dfs(tx, ty); //朝着一个方向深度搜索
}
}
return; //遍历完四个方向则返回上一个点
}
public static void main(String[] args) {
Ah_4_41 ah = new Ah_4_41();
ah.dfs(3, 3);
System.out.println("坐标为: " + ah.X + " " + ah.Y);
System.out.println("最大敌人为: " + ah.max);
}
}
枚举 + 深度搜索 ----炸弹人
最新推荐文章于 2024-09-12 16:50:41 发布