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

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);
	}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值