我们先将这个地图模型化,墙用#表示,这里有两种墙,一种是可以被炸弹炸掉的,另外一种是不可能
被炸掉的。但是由于现在只有一枚炸弹,所以都用#表示,炸弹是不能穿墙的。敌人用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
接下来是读入迷宫的模型
输出最大杀敌数和相对应的坐标位置!