해당 위치가 현재 벽이 아니다
+ 내가 이동한 직후 벽으로 바뀌지 않는다
라는 두 조건을 모두 만족해야 합니다.해당 위치가 현재 벽이 아니다
를 확인한 뒤 해당 좌표를 다시 큐에 삽입합니다.제자리에 가만히 있는 움직임
이 존재합니다.import java.util.*;
import java.io.*;
public class Main {
static int[] dx = { 1, 1, 1, 0, 0, 0, -1, -1, -1 };
static int[] dy = { 1, 0, -1, 1, 0, -1, 1, 0, -1 };
static int N = 8;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
char[][] board = new char[N][N];
List<int[]> wall = new LinkedList<int[]>(); // 벽의 좌표 모음
for (int i = 0; i < N; i++) {
board[i] = br.readLine().toCharArray();
for (int j = 0; j < N; j++) {
if(board[i][j] == '#') {
wall.add(new int[] {i,j});
}
}
}
System.out.println(BFS(wall));
}
public static int BFS(List<int[]> wall) {
Queue<int[]> q = new LinkedList<int[]>();
q.add(new int[] {7,0});
boolean[][] v = new boolean[N][N];
v[7][0] = true;
while(!q.isEmpty()) {
int size = q.size();
List<int[]> tempList = new LinkedList<int[]>();
while(--size>=0) {
int[] now = q.poll();
if(now[0] == 0 && now[1] == 7) {
return 1;
}
for (int d = 0; d < 9; d++) {
int nx = now[0]+dx[d];
int ny = now[1]+dy[d];
if(0<=nx && nx<N && 0<=ny && ny <N && !isBlocked(new int[] {nx,ny}, wall)) {
if((nx == now[0] && ny == now[1])||!v[nx][ny]) { // 제자리에 가만히 있는건 방문여부에 영향을 받지 않아야 한다
tempList.add(new int[] {nx,ny}); // 현재 상태(벽이 움직이기 전)에서 이동할 수 있는 좌표
}
}
}
}
wallMove(wall); // 벽이 이동함
for (int i = 0; i < tempList.size(); i++) {
int[] now = tempList.get(i);
if(!isBlocked(now,wall)) {
v[now[0]][now[1]] = true; // 벽이 이동한 뒤에도 유효한 좌표
q.add(now);
}
}
}
return 0;
}
public static void wallMove(List<int[]> wall) { // 모든 벽이 아래로 한칸 움직임
for (int i = 0; i < wall.size(); i++) {
int[] now = wall.get(i);
if(now[0]+1<N) {
now[0] += 1;
}else {
wall.remove(i);
i--;
}
}
}
public static boolean isBlocked(int[] now, List<int[]> wall) { // 벽으로 가로막혔는지 확인
for (int i = 0; i < wall.size(); i++) {
int[] temp = wall.get(i);
if(now[0] == temp[0] && now[1] == temp[1]) {
return true;
}
}
return false;
}
}
제자리에 가만히 있는게 방문처리되지 않는다는 건 제자리값이 큐에 무한으로 삽입된다는 의미이다.
하지만 내 코드는 정답처리 되었고, 그 이유를 생각해본 결과 아래와 같다.
예시
.#...... ........
.#...... ........
.#...... 8초 후에 ........
.#...... -------> ........
.#...... ........
.#...... ........
.#...... ........
.#...... ........