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,否则按无效代码处理。

// 深搜
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;
			}
		}
	}
}
原文地址:https://www.cnblogs.com/a1439775520/p/13077003.html