迷宫的地图,用二维矩阵表示。第一行是表示矩阵的行数和列数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; } }