首页 > 代码库 > 炸弹人

炸弹人

炸弹人只能在一个位置投放炸弹,炸弹能够同时向“上下左右”四个方向同时射去,但是不能穿墙,求炸弹人能够炸最多敌人的位置

技术分享
 1 import java.util.Iterator;
 2 import java.util.LinkedList;
 3 import java.util.Scanner;
 4 import java.util.TreeSet;
 5 import java.util.Scanner;
 6 public class One {
 7     public static int f(int x,int y,char a[][]){
 8         int num=0;
 9             //向上
10             int tx=x,ty=y;
11             while(a[tx][ty]!=‘#‘){
12                 if(a[tx][ty]==‘G‘)num++;
13                 tx--;
14             }
15             //向下
16             tx=x;
17             ty=y;
18             while(a[tx][ty]!=‘#‘){
19                 if(a[tx][ty]==‘G‘)num++;
20                 tx++;
21             }
22             //向左
23             tx=x;
24             ty=y;
25             while(a[tx][ty]!=‘#‘){
26                 if(a[tx][ty]==‘G‘)num++;
27                 ty--;
28             }
29             //向右
30             tx=x;
31             ty=y;
32             while(a[tx][ty]!=‘#‘){
33                 if(a[tx][ty]==‘G‘)num++;
34                 ty++;
35             }
36         return num;
37         
38     }
39     public static void main(String ags[]){
40         int n,m,p,q;//n,m为地图行列,p,q为小人游戏开始时的数组位置
41         int d[][]={{0,1},{1,0},{0,-1},{-1,0}};//方向移动控制
42         LinkedList<Note> list=new LinkedList<Note>();//用于存放所有可能达到的点
43         Scanner scanner=new Scanner(System.in);
44         System.out.println("请输入地图行列:");
45         n=scanner.nextInt();
46         m=scanner.nextInt();
47         char a[][]=new char[n][m];//存放地图
48         int book[][]=new int[n][m];//记录某点是否已经走过了
49         System.out.println("请输入地图:");
50         Scanner in=new Scanner(System.in);
51         for(int i=0;i<n;i++){
52             for(int j=0;j<m;j++){
53                 a[i][j]=in.next().charAt(0);
54             }
55             System.out.println("");
56         }
57         System.out.println("请输入小人初始位置:");
58         p=scanner.nextInt();
59         q=scanner.nextInt();
60         
61         //开始试探所有可能的点
62         int tx,ty,max=0,m1=0,m2=0;//tx,ty为当前点扩展的数组行列号,max为记录当前最大能消灭敌人的数,m1,m2用来记录能消灭敌人最大数目的位置
63         list.add(new Note(p,q,f(p,q,a)));//将小人初始位置放入链表
64         book[p][q]=1;
65         while(!list.isEmpty()){//如果连比较不为空
66             for(int k=0;k<=3;k++){//四个方向探索
67                 tx=list.getFirst().x+d[k][0];
68                 ty=list.getFirst().y+d[k][1];
69                 if(a[tx][ty]==‘.‘&&book[tx][ty]==0){//如果该点为空的(即小人可以到达的),则将该点加入链表,并且能消灭的敌人数与max比较
70                     book[tx][ty]=1;
71                     list.add(new Note(tx,ty,f(tx,ty,a)));
72                     if(list.getFirst().n>max){
73                         max=list.getFirst().n;
74                         m1=list.getFirst().x;
75                         m2=list.getFirst().y;
76                     }
77                 }
78             }
79             list.removeFirst();
80         }
81         System.out.println("位置"+m1+","+m2+"能消灭最多敌人,数目为:"+max);
82     }
83 }
84 class Note{
85     int x,y,n;
86     Note(int x,int y,int n){
87         this.x=x;
88         this.y=y;
89         this.n=n;
90     }
91 }
炸弹人(广度优先搜索)

运行如下图所示:

技术分享

炸弹人