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

来源:互联网 发布:iphone怎么授权软件 编辑:程序博客网 时间:2024/05/16 07:48


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

被炸掉的。但是由于现在只有一枚炸弹,所以都用#表示,炸弹是不能穿墙的。敌人用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 stubScanner sc = new Scanner(System.in);n = sc.nextInt();// hangm = sc.nextInt();// lieint startx = sc.nextInt();// startXint starty = sc.nextInt();// startYsc.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 stubint 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

接下来是读入迷宫的模型

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

0 0
原创粉丝点击