• 문제 링크
16954번: 움직이는 미로 탈출
욱제는 학교 숙제로 크기가 8×8인 체스판에서 탈출하는 게임을 만들었다. 체스판의 모든 칸은 빈 칸 또는 벽 중 하나이다. 욱제의 캐릭터는 가장 왼쪽 아랫 칸에 있고, 이 캐릭터는 가장 오른쪽
www.acmicpc.net
• 풀이 과정
• 풀이 코드
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
public class Main {
static char[][] map;
static boolean[][][] visit;
static int[] dy = {-1, 1, 0, 0, -1, -1, 1, 1, 0};
static int[] dx = {0, 0, -1, 1, -1, 1, 1, -1, 0};
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
map = new char[8][8];
visit = new boolean[8][8][9];
for (int i = 0; i < 8; i++)
map[i] = br.readLine().toCharArray();
bw.write(bfs() ? "1" : "0");
bw.flush();
}
private static boolean bfs() {
Queue<Node> q = new LinkedList<>();
q.offer(new Node(7, 0, 0));
visit[7][0][0] = true;
while (!q.isEmpty()) {
Node cur = q.poll();
int cnt = cur.cnt;
if (cur.y == 0 && cur.x == 7)
return true;
for (int i = 0; i < 9; i++) {
int ny = cur.y + dy[i];
int nx = cur.x + dx[i];
int nCnt = Math.min(cnt + 1, 8);
if (ny < 0 || ny >= 8 || nx < 0 || nx >= 8)
continue;
if (ny - cnt >= 0 && map[ny - cnt][nx] == '#')
continue;
if (ny - cnt - 1 >= 0 && map[ny - cnt - 1][nx] == '#')
continue;
if (!visit[ny][nx][nCnt]) {
visit[ny][nx][nCnt] = true;
q.offer(new Node(ny, nx, nCnt));
}
}
}
return false;
}
private static class Node {
int y, x, cnt;
public Node(int y, int x, int cnt) {
this.y = y;
this.x = x;
this.cnt = cnt;
}
}
}
'Problem Solving > Baekjoon' 카테고리의 다른 글
[백준] 1963 소수 경로 - Graph Theory / Java (0) | 2022.10.12 |
---|---|
[백준] 6087 레이저 통신 - Graph Theory / Java (0) | 2022.10.11 |
[백준] 2206 벽 부수고 이동하기 - Graph Theory / Java (0) | 2022.10.09 |
[백준] 12886 돌 그룹 - Graph Theory / Java (0) | 2022.10.08 |
[백준] 16948 데스 나이트 - Graph Theory / Java (0) | 2022.10.07 |
댓글