您的位置:首页 > 其它

枚举 + 深度搜索 ----炸弹人

2018-01-29 16:36 253 查看
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
[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);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: