题解 | 量子网络穿梭 | BFS
量子网络穿梭
https://www.nowcoder.com/practice/1352032ab7744c148577c0d05eff841b
import java.util.LinkedList; import java.util.Scanner; // 注意类名必须为 Main, 不要有任何 package xxx 信息 public class Main { public static void main(String[] args) { Scanner in = new Scanner(System.in); int[] s = new int[]{-1, -1}; // 起点 int[] g1 = new int[]{-1, -1}, g2 = new int[]{-1, -1}; // 两个纠缠门的位置 int step = -1; int m = in.nextInt(), n = in.nextInt(); char[][] net = new char[m][n]; boolean[][] visited = new boolean[m][n]; for(int i = 0;i<m;i++){ String tmp = in.next(); for(int j = 0;j<n;j++){ net[i][j] = tmp.charAt(j); // 记录 if(net[i][j] == 'S') s = new int[]{i, j}; else if(net[i][j] == '2'){ if(g1[0] == -1) g1 = new int[]{i, j}; else g2 = new int[]{i, j}; } } } // 从起点开始 boolean finish = false; LinkedList<int[]> worklist = new LinkedList<>(); // bfs worklist.add(s); // 记录当前位置 while(!finish && worklist.size() != 0){ step ++; LinkedList<int[]> next = new LinkedList<>(); for(int[] item: worklist){ visited[item[0]][item[1]] = true; // 标记遍历过了 // System.out.printf("now is %d, %d, %c\n", item[0], item[1], net[item[0]][item[1]]); if(net[item[0]][item[1]] == 'E'){ finish = true; break; // 到达终点 } if(net[item[0]][item[1]] == '1'){ // 标准通道 continue; } if(net[item[0]][item[1]] == '2'){ // 传送门 if(item[0] == g1[0] && item[1] == g1[1]){ // 是第一个传送门 visited[g2[0]][g2[1]] = true; // 直接传送到第二个传送门 move(net, visited, g2, next); }else{ // 这是第二个传送门 visited[g1[0]][g1[1]] = true; move(net, visited, g1, next); } } move(net, visited, item, next); } // System.out.println(next.size()); worklist = next; // 替换 } if(finish) System.out.println(step); else System.out.println(-1); } private static void move(char[][] net, boolean[][] visited, int[] now, LinkedList<int[]> next){ int x = now[0], y = now[1]; int m = net.length, n = net[0].length; if(x - 1 >= 0 && !visited[x-1][y] && net[x-1][y] != '1') next.add(new int[]{x-1, y}); if(x + 1 < m && !visited[x+1][y] && net[x+1][y] != '1') next.add(new int[]{x+1, y}); if(y - 1 >= 0 && !visited[x][y-1] && net[x][y-1] != '1') next.add(new int[]{x, y-1}); if(y + 1 < n && !visited[x][y+1] && net[x][y+1] != '1') next.add(new int[]{x, y+1}); } }