[백준/JAVA] 16928번: 뱀과 사다리 게임(BFS)
2023. 1. 19. 02:30ㆍ문제풀이/BFS
문제
https://www.acmicpc.net/problem/16928
16928번: 뱀과 사다리 게임
첫째 줄에 게임판에 있는 사다리의 수 N(1 ≤ N ≤ 15)과 뱀의 수 M(1 ≤ M ≤ 15)이 주어진다. 둘째 줄부터 N개의 줄에는 사다리의 정보를 의미하는 x, y (x < y)가 주어진다. x번 칸에 도착하면, y번 칸으
www.acmicpc.net
풀이
사다리가 있는 위치라면 사다리를 타고 올라갈 위치가 존재하고, 뱀이 있는 위치라면 뱀을 타고 내려갈 위치가 존재한다.
사다리와 뱀이 있는 위치와, 이동할 위치를 해시맵으로 저장한다.
ladder = new HashMap<>(); //사다리와 이동 위치 저장할 해시맵
snake = new HashMap<>(); //뱀과 이동 위치 저장할 해시맵
for(int i = 0; i<n; i++){ //n은 사다리의 개수
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
ladder.put(x, y);
}
for(int i = 0; i<m; i++){ //m은 뱀의 개수
st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
snake.put(u, v);
}
게임은 주사위를 던져 나온 수만큼 이동한다.
즉, 게임에서 다음 위치(next)는 현재 위치 + 주사위의 수이다. 이 때, 주사위의 수가 1부터 6까지 나올 수 있으므로 경우의 수는 6이다.
다음 위치에 따른 최종 이동 위치는 아래의 경우로 나누어 결정할 수 있다.
① next>100인 경우, 이동하지 않고 현재 위치에 머무른다.
② 다음 이동 칸에 사다리 또는 뱀이 있는 경우, 최종 이동 위치는 사다리 또는 뱀을 통해 이동되는 위치이다.
③ next = 100인 경우, 현재까지 주사위를 굴린 수를 출력하고 종료한다.
④ 1≤ next <100인 경우
- 최종 이동 위치를 방문한 적이 없다면(visited가 0이라면)
- 최종 이동 위치의 visited값이 현재 visited보다 2이상 크다면(현재 visited 값에서 +1한 값이 원래의 값보다 작아 최솟값인 경우)
최종 이동 위치의 visited 값을 현재 위치(x)의 visited 값에 +1한 값으로 저장한다(최솟값으로 저장하기 위함).
그리고, 큐에 next를 넣는다.
※②와 ③을 확인하는 순서는 절대 바뀌어서는 안된다. ②의 과정을 통해 최종 이동 위치가 결정되기 때문이다.
코드
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;
public class Main {
private static HashMap<Integer, Integer> ladder;
private static HashMap<Integer, Integer> snake;
private static void BFS(){
Queue<Integer> q = new LinkedList<>();
int[] visited = new int[101];
q.offer(1);
visited[1] = 1;
while(!q.isEmpty()){
int current = q.poll();
for(int i = 0; i<6; i++){
int next = current + i+1;
if(next>100) continue;
if(ladder.containsKey(next)){
next = ladder.get(next);
}else if(snake.containsKey(next)){
next = snake.get(next);
}
if(next == 100){
System.out.println(visited[current]);
return;
}
if(next>=1 && next<100){
if(visited[next] ==0 | visited[current]+1<visited[next]){
visited[next] = visited[current]+1;
q.offer(next);
}
}
}
}
}
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
int n = Integer.parseInt(st.nextToken());
int m = Integer.parseInt(st.nextToken());
ladder = new HashMap<>();
snake = new HashMap<>();
for(int i = 0; i<n; i++){
st = new StringTokenizer(br.readLine());
int x = Integer.parseInt(st.nextToken());
int y = Integer.parseInt(st.nextToken());
ladder.put(x, y);
}
for(int i = 0; i<m; i++){
st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken());
int v = Integer.parseInt(st.nextToken());
snake.put(u, v);
}
BFS();
}
}
'문제풀이 > BFS' 카테고리의 다른 글
[백준/JAVA] 13913번 : 숨바꼭질4(BFS) (0) | 2023.01.19 |
---|---|
[백준/JAVA] 1697번 : 숨바꼭질(BFS) (0) | 2023.01.13 |