BOJ 1473 - 미로 탈출

BFS인데 현재 회전 상태를 비트마스크로 나타낼 수 있다. 가로 세로 길이가 작으므로 정점은 총 WH2W2HW \cdot H \cdot 2^W \cdot 2^H 의 가지수가 존재하게 된다.

이는 대략 백만개이므로 최단거리를 구하는 BFS를 수행해줄 수 있다.

(y,x)(y,x) 에서 dd 방향으로 현재 비트마스크에 따라서 문이 열려있는지 확인하는 코드이다.

function<bool(int, int, int, int, int)>
      passable = [&](int y, int x, int dir, int ybit, int xbit) -> bool {
      if (b[y][x] == 'A') return 1;
      if (b[y][x] == 'B') return 0;

      int vert = b[y][x] == 'C';
      int hor = b[y][x] == 'D';

      int parity = !!(ybit & (1 << y)) + !!(xbit & (1 << x));
      parity %= 2;

      if (parity) vert ^= 1, hor ^= 1;
      if (dir == 0 || dir == 2) return vert;
      else return hor;
   };

AA면 항상 가능, BB면 항상 불가능하다.

만약 CC 라면 원래는 세로(d=0,2d=0,\,2)로 열려있었는데, (y,x)(y,x) 에서 yy 행과 xx 가 문이 90°90 \degree돌아간 상태인지를 확인한다.

이 parity가 짝수면 기존 상태와 다르지 않은것이고 홀수면 반대가 된 것이다.

Tags:

Categories:

Updated:

Comments