穿越雷区
题目描述
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,否则按无效代码处理。
// 深搜
import java.util.Scanner;
public class Main {
// 下一步的方向,分别为:上,下,左,右
static int[][] dir = { { 0, -1 }, { 0, 1 }, { -1, 0 }, { 1, 0 } };
// 答案
static int ans = Integer.MAX_VALUE;
public static void main(String[] args) {
Scanner s = new Scanner(System.in);
int n = s.nextInt();
String[][] map = new String[n][n];
// 1代表访问过,0代表未访问过
int[][] visit = new int[n][n];
// A的行号
int x = 0;
// A的列号
int y = 0;
for (int i = 0; i < map.length; i++) {
for (int j = 0; j < map[i].length; j++) {
map[i][j] = s.next();
if (map[i][j].equals("A")) {
x = i;
y = j;
}
}
}
dfs(map, visit, x, y, 0);
System.out.println(ans);
s.close();
}
public static void dfs(String[][] map, int[][] visit, int row, int col, int step) {
if (map[row][col].equals("B")) {
if (step < ans)
ans = step;
return;
}
visit[row][col] = 1;
for (int i = 0; i < dir.length; i++) {
// 下一步行号
int nextRow = row + dir[i][0];
// 下一步列号
int nextCol = col + dir[i][1];
if (nextRow < 0 || nextRow >= map.length || nextCol < 0 || nextCol >= map.length)
continue;
if (visit[nextRow][nextCol] == 0) {
visit[nextRow][nextCol] = 1;
if (!map[nextRow][nextCol].equals(map[row][col]))
dfs(map, visit, nextRow, nextCol, step + 1);
// 回溯
visit[nextRow][nextCol] = 0;
}
}
}
}