leetcode 934. Shortest Bridge

The algorithm for this problem is not so hard to figure out.

This is a problem of finding the length of the shortest path in graph. As I mentioned in my previous article, BFS is a good way to slove this kind of problem.

This problem is a little different, it's no begining point but beginning points. So before the real BFS, we should find all points in one island. Then we can begin our bfs with a queue which contains all points of one island.

It's marked as medium in leetcode, but the recommended solution has 81 lines. And after some inspection on discuss articles, I found that most solutions exceed 40 lines. It's really not easy to get AC once with that many code. So I think hard is a more accurate label for this problem.

    class Solution {
         public int shortestBridge(int[][] A) {
            int M = A.length, N = A[0].length;
            int i = 0;
            for (i = 0; i < M * N; ++i) {
                if (A[i / N][i % N] == 1) break;
            }
            Map<Integer, Integer> s = new HashMap<>();
            Queue<Integer> q = new LinkedList<>();
            q.add(i);
            s.put(i, 1);
            int[][] moves = new int[][]{{-1, 0}, {1, 0}, {0, 1}, {0, -1}};
            while (!q.isEmpty()) {
                Integer pos = q.poll();
                int x = pos / N, y = pos % N;
                for (int[] move: moves) {
                    int nx = x + move[0], ny = y + move[1];
                    if (nx >= 0 && ny >= 0 && nx < M && ny < N) {
                        int val = nx * N + ny;
                        if (s.get(val) == null && A[nx][ny] == 1) {
                            s.put(val, 1);
                            q.add(val);
                        }
                    }
                }
            }
            q.addAll(s.keySet());
            while (!q.isEmpty()) {
                Integer pos = q.poll();
                Integer mark = s.get(pos);
                int x = pos / N, y = pos % N;
                for (int[] move: moves) {
                    int nx = x + move[0], ny = y + move[1];
                    if (nx >= 0 && ny >= 0 && nx < M && ny < N) {
                        int val = nx * N + ny;
                        if (s.get(val) == null) {
                            if (A[nx][ny] == 0) {
                                s.put(val, mark + 1);
                                q.add(val);
                            }
                            else {
                                return mark - 1;
                            }
                        }
                    }
                }
            }
            return -1;
        }
    }

猜你喜欢

转载自www.cnblogs.com/exhausttolive/p/10604148.html