题解 | 量子网络穿梭 | 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});
    }
}

全部评论

相关推荐

评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务