迷宫的地图,用二维矩阵表示。第一行是表示矩阵的行数和列数M和N 后面的M行是矩阵的数据,每一行对应与矩阵的一行(中间没有空格)。M和N都不超过100, 门不超过10扇。
路径的长度,是一个整数
5 5 02111 01a0A 01003 01001 01111
7
import java.util.*;
class Node {
int x, y, keys, steps;
public Node(int x, int y, int keys, int steps) {
this.x = x;
this.y = y;
this.keys = keys;
this.steps = steps;
}
}
// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static int m, n;
public static char[][] maze;
public static int[][][] visited; //保存是否已经计算过
public static int[] dirX = {0, 0, 1, -1};
public static int[] dirY = {1, -1, 0, 0};
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
m = in.nextInt();
n = in.nextInt();
in.nextLine();
maze = new char[m][n];
visited = new int[m][n][1024];
for (int i = 0; i < m; i++) {
String str = in.nextLine();
//in.nextLine();
maze[i] = str.toCharArray();
//System.out.println(maze[i]);
}
int ans = -1;
for (int i = 0; i < m; i++) {
for (int j = 0; j < n; j++) {
if (maze[i][j] == '2') {
visited[i][j][0] = 1;
ans = bfs(i, j);
break;
}
}
}
System.out.println(ans);
}
public static int bfs(int i, int j) {
Queue<Node> q = new LinkedList<>();
//将入口加入队列,没钥匙,0步
q.add(new Node(i, j, 0, 0));
while (!q.isEmpty()) {
Node node = q.poll();
//下面特别注意当前点是node.x,node.y,不是i,j
if (maze[node.x][node.y] == '3') {
//到达出口,退出
return node.steps;
}
//4个方向扩散
for (int d = 0; d < 4; d++) {
int newX = node.x + dirX[d];
int newY = node.y + dirY[d];
if (newX >= 0 && newX < m && newY >= 0 && newY < n) {
int key = node.keys;
if (maze[newX][newY] == '0') {
continue;
}
//遇到钥匙,增加新钥匙
if (maze[newX][newY] >= 'a' && maze[newX][newY] <= 'z') {
key = key | (1 << (maze[newX][newY] - 'a'));
}
//遇到门,且当前钥匙串没有对应钥匙,结束
if (maze[newX][newY] >= 'A' && maze[newX][newY] <= 'Z'
&& (key & (1 << (maze[newX][newY] - 'A'))) == 0) {
continue;
}
//剩下是可通过情形
if (visited[newX][newY][key] == 0) {
visited[newX][newY][key] = 1;
q.add(new Node(newX, newY, key, node.steps + 1));
}
}
}
}
return 0;
}
}