蓝桥杯 穿越雷区 (Java广搜+字符串处理)
蓝桥杯 穿越雷区
X星的坦克战车很奇怪,它必须交替地穿越正能量辐射区和负能量辐射区才能保持正常运转,否则将报废。
某坦克需要从A区到B区去(A,B区本身是安全区,没有正能量或负能量特征),怎样走才能路径最短?
已知的地图是一个方阵,上面用字母标出了A,B区,其它区都标了正号或负号分别表示正负能量辐射区。
例如:
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
坦克车只能水平或垂直方向上移动到相邻的区。
数据格式要求:
输入第一行是一个整数n,表示方阵的大小, 4<=n<100
接下来是n行,每行有n个数据,可能是A,B,+,-中的某一个,中间用空格分开。
A,B都只出现一次。
要求输出一个整数,表示坦克从A区到B区的最少移动步数。
如果没有方案,则输出-1
例如:
用户输入:
5
A + - + -
- + - - +
- + + + -
+ - + - +
B + - + -
则程序应该输出:
10
资源约定:
峰值内存消耗(含虚拟机) < 512M
CPU消耗 < 2000ms
请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。
所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。
注意:不要使用package语句。不要使用jdk1.7及以上版本的特性。
注意:主类的名字必须是:Main,否则按无效代码处理。
题解:这一题就是一个很中规中矩的广搜 个人觉得难点在于怎么处理给出的图中的空格。
注意点:
1、要是用cin.nextLine()那就全部输入都用,包括最开始输入的n。
2、我们可以用 String s[] = cin.nextLine().split(" ") 将每一行的字符串中空格去掉,变成一个个没有空格的子字符串,保存在字符串数组s[]中。
3、StringBuffer类可以在字符串后面任意添加字符串。
4、node 用之前一定要重新new.
1 import java.util.ArrayDeque;
2 import java.util.Scanner;
3 class node{
4 int x;
5 int y;
6 int step;
7 int flag;
8 }
9 public class Main {
10 static int [][] vis = new int [110][110];
11 static int sx,sy,ex,ey,n,ans = Integer.MAX_VALUE;
12 static char [][] mp = new char[110][110];
13 static int dir[][] = {{0,1},{1,0},{-1,0},{0,-1}};
14 static node head,tail;
15 static ArrayDeque<node> q = new ArrayDeque<node>();
16 static void bfs() {
17 q.offer(head);
18 while(!q.isEmpty()) {
19 node head = new node();//必须写
20 head = q.poll();
21 if(head.x==ex&&head.y==ey) {
22 ans = Math.min(ans, head.step);
23 return;
24 }
25 for(int i=0;i<4;i++) {
26 int tx = head.x + dir[i][0];
27 int ty = head.y + dir[i][1];
28 if(tx<0||tx>=n||ty<0||ty>=n||vis[tx][ty]==1)
29 continue;
30 if(head.flag==-1) {
31 if(mp[tx][ty]=='-')
32 continue;
33 }
34 if(head.flag==1)
35 if(mp[tx][ty]=='+')
36 continue;
37 vis[tx][ty] = 1;
38 tail = new node();//必写
39 tail.x = tx;
40 tail.y = ty;
41 tail.flag = -head.flag;
42 tail.step = head.step + 1;
43 q.offer(tail);
44 }
45 }
46 }
47 public static void main(String[] args) {
48 Scanner cin = new Scanner(System.in);
49 n = Integer.parseInt(cin.nextLine());
50 for(int i=0;i<n;i++) {
51 String s[] = cin.nextLine().split(" ");
52 StringBuffer c = new StringBuffer();
53 for(int j=0;j<s.length;j++)
54 c.append(s[j]);
55 for(int j=0;j<c.length();j++)
56 mp[i][j] = c.charAt(j);
57 }
58 for(int i=0;i<n;i++) {
59 for(int j=0;j<n;j++) {
60 if(mp[i][j]=='A') {
61 sx = i;
62 sy = j;
63 }
64 if(mp[i][j]=='B') {
65 ex = i;
66 ey = j;
67 }
68 }
69 }
70 head = new node();
71 head.x = sx;
72 head.y = sy;
73 head.flag = -1;
74 head.step = 0;
75 bfs();
76 head.x = sx;
77 head.y = sy;
78 head.flag = 1;
79 head.step = 0;
80 bfs();
81 if(ans!=Integer.MAX_VALUE)
82 System.out.println(ans);
83 else
84 System.out.println(-1);
85 }
86 }