深度优先搜索+解炸弹人游戏


我们先将这个地图模型化,墙用#表示,这里有两种墙,一种是可以被炸弹炸掉的,另外一种是不可能

被炸掉的。但是由于现在只有一枚炸弹,所以都用#表示,炸弹是不能穿墙的。敌人用G表示,空地用 . 表示

,当然炸弹只能放在空地上。


#############
#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#
#############

下面看代码:


<span style="font-size:18px;">import java.util.Scanner;

public class boom {
	static int[][] next = new int[][] {
		{ -1, 0 }, //向上
		{ 0, 1 }, //向右
		{ 1, 0 }, //向左
		{ 0, -1 } //向下
		};
	static int[][] book;
	static int n , m ;
	static char[][] boompeople;
	static int maxGG=Integer.MIN_VALUE;
	static int how = 0;
	static int mx,my;
	public static void main(String[] args) {
		// TODO Ai-generated method stub
		Scanner sc = new Scanner(System.in);
		n = sc.nextInt();// hang
		m = sc.nextInt();// lie
		int startx = sc.nextInt();// startX
		int starty = sc.nextInt();// startY
		sc.nextLine();
		String[] ste=new String[m];
		for (int i = 0; i < m; i++) {
			ste[i]=sc.nextLine();
		}
		book = new int[n + 1][m + 1];
		boompeople = new char[n + 1][m + 1];// 迷宫
		for (int i = 0; i < m; i++) {// 读入迷宫,从1开始 舍弃0角标,方便操作
			boompeople[i]=ste[i].toCharArray();
		}
		book[startx][starty]=1;//将开始坐标标记为已经走过的坐标,避免重复
		maxGG=gethow(startx, starty);//统计开始坐标的杀敌数
		//记录杀敌数对应的坐标,即为开始坐标,上面的开始坐标统计以及将杀敌
		//数更为开始坐标的杀敌数,所以需要更新坐标
		mx=startx;
		my=starty;
		dfs(startx, starty);
		System.out.println("最大杀敌数量是:"+maxGG);
		System.out.println("坐标是:"+mx+","+my);

	}

	private static void dfs(int x, int y) {
		// TODO Auto-generated method stub
		//计算当前点能消灭的敌人
		how=gethow(x,y);
		//是否需要更新最大值
		if (how > maxGG)//如果当前点的杀人统计大于最大值,更新最大值,并记录当前最大值坐标
			
		{
			maxGG=how;
			mx=x;
			my=y;
		}
		
		
		int tx, ty;
		for (int j = 0; j < 4; j++) {// 枚举方向
			tx =x+ next[j][1];
			ty =y + next[j][0];
			//判断是否越界
			if (tx < 0 || ty < 0 || tx > n || ty > m ) {
				continue;
			}
			//判断是否能够走通
			if (book[tx][ty] == 0 && boompeople[tx][ty] =='.') {
				book[tx][ty] = 1;
				//尝试下一个坐标
				dfs(tx,ty);
			}
			
		}
	}

	private static int gethow(int i, int j) {
		// TODO Auto-generated method stub
		int sum,x,y;
		sum=0;//sum用来计数,(可以消灭的敌人数),所以需要初始化为0;
		//将坐标i,j 复制到两个新的变量 x ,y,中,以便之后在上下左右四个方向统计可以消灭
		//的敌人数量
		//向上统计可以消灭敌人的数量
		x=i;
		y=j;
		while(boompeople[x][y]!='#')
		{
			//如果当前是敌人进行计数
			if(boompeople[x][y]=='G')
				sum++;
			x--;//向上统计
		}
		x=i;y=j;
		while(boompeople[x][y]!='#')
		{
			if(boompeople[x][y] == 'G')
				sum++;
			x++;//向下统计
		}
		x=i;y=j;
		while(boompeople[x][y]!='#')
		{
			if (boompeople[x][y] =='G') {
				sum++;
			}
			y--;//向左统计
		}
		x=i;y=j;
		while(boompeople[x][y]!='#')
		{
			if(boompeople[x][y]=='G')
				sum++;
			y++;//向右统计
		}
		return sum;
	}

}</span>


测试数据:

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#
#############
最大杀敌数量是:10
坐标是:7,11

在这里第一行四个整数分别表示:迷宫的行和列,炸弹人开始的坐标x和y

接下来是读入迷宫的模型

输出最大杀敌数和相对应的坐标位置!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值