CERK07- SPOJ - битовая маска в BFS - PullRequest
1 голос
/ 23 апреля 2020

Я пытаюсь решить проблему SPOJ CERK07- KeyTask. Я изучил новую концепцию здесь, используя битовую маску в BFS. Я пытаюсь реализовать свой код в java. У меня проблема в else if(val == 'R'|| val == 'G' || val == 'B' || val =='Y') состоянии (то есть когда я сталкиваюсь с дверью), и я хочу проверить, есть ли ключ для этой двери. Моя intelliJ IDE предполагает, что условие case 'B': if((umask & 0x2) == 1 ) всегда ложно. То же самое относится ко всем остальным дверям ниже этого условия. Я не знаю, почему это происходит?

 public static int bfs(int[] start, char[][] grid, int[][][] d) {
        int m = grid.length;
        int n = grid[0].length;

        Queue<int[]> q = new LinkedList<>();
        q.add(new int[]{start[0], start[1], 0});

        while (!q.isEmpty()) {
            int[] curr = q.poll();
            int x = curr[0];
            int y = curr[1];
            int umask = curr[2];
            final int[][] shifts = {
                    {-1, 0},
                    {0, 1},
                    {1, 0},
                    {0, -1}
            };
            for (int[] shift : shifts) {
                int dx = x + shift[0];
                int dy = y + shift[1];

                if (isValid(dx, dy, m, n) && grid[dx][dy] != '#') {
                    if (grid[dx][dy] == 'X') {
                        return d[x][y][umask] + 1;
                    }
                    if (d[dx][dy][umask] == -1) {
                        char val = grid[dx][dy];
                        if (val == 'r' || val == 'b' || val == 'g' || val == 'y') {
                            int vmask = umask;
                            if (val == 'r') vmask |= 0x1;
                            else if (val == 'b') vmask |= 0x2;
                            else if (val == 'g') vmask |= 0x4;
                            else vmask |= 0x8;

                            q.add(new int[]{dx, dy, vmask});
                            d[dx][dy][umask] = d[x][y][umask] + 1;
                            d[dx][dy][vmask] = d[dx][dy][umask];
                        } else if (val == 'R' || val == 'G' || val == 'B' || val == 'Y') {
                            switch (val) {
                                case 'R':
                                    if ((umask & 0x1) == 1) q.add(new int[]{dx, dy, umask});
                                    break;
                                case 'B':
                                    if ((umask & 0x2) == 1) q.add(new int[]{dx, dy, umask});
                                    break;
                                case 'G':
                                    if ((umask & 0x4) == 1) q.add(new int[]{dx, dy, umask});
                                    break;
                                case 'Y':
                                    if ((umask & 0x8) == 1) q.add(new int[]{dx, dy, umask});
                                    break;
                            }
                            d[dx][dy][umask] = d[x][y][umask] + 1;
                        } else {
                            q.add(new int[]{dx, dy, umask});
                            d[dx][dy][umask] = d[x][y][umask] + 1;
                        }
                    }
                }
            }
        }
        return -1;
    }

1 Ответ

1 голос
/ 24 апреля 2020

Результат выражения (umask & 0x2) равен 0 или 2. Он не может быть 1, поэтому IntelliJ IDEA предупреждает вас об этом. Точно так же (umask & 0x4) - это либо 0, либо 4, а (umask & 0x8) - либо 0, либо 8. Вероятно, вы хотели написать (umask & 0x2) == 2 и так далее. Таким образом, ваше состояние станет правильным, и предупреждение исчезнет.

...