https://www.acmicpc.net/problem/1600
1600๋ฒ: ๋ง์ด ๋๊ณ ํ ์์ญ์ด
์ฒซ์งธ ์ค์ ์ ์ K๊ฐ ์ฃผ์ด์ง๋ค. ๋์งธ ์ค์ ๊ฒฉ์ํ์ ๊ฐ๋ก๊ธธ์ด W, ์ธ๋ก๊ธธ์ด H๊ฐ ์ฃผ์ด์ง๋ค. ๊ทธ ๋ค์ H์ค์ ๊ฑธ์ณ W๊ฐ์ ์ซ์๊ฐ ์ฃผ์ด์ง๋๋ฐ, 0์ ์๋ฌด๊ฒ๋ ์๋ ํ์ง, 1์ ์ฅ์ ๋ฌผ์ ๋ปํ๋ค. ์ฅ์ ๋ฌผ์ด ์
www.acmicpc.net
ํ์ด๋ฅผ ์ํ ํต์ฌ
๋ง ์ด๋ ํ์์ ๋ฐ๋ฅธ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ํด์ค์ผ ํฉ๋๋ค.
๋ณดํต ๋ฐฉ๋ฌธ์ฒดํฌ๋ฅผ visited[][] ์ ๊ฐ์ด 2์ฐจ์ ๋ฐฐ์ด๋ก ์งํํ์ง๋ง, ์ด๋ ๊ฒ ํ๊ฒ๋๋ฉด ๋ง๋ก ์ด๋ํ ์ง์ ์ visited๊ฐ true๋ก ๋์ด ๊ทธ๋ฅ ์ด๋์ด ๋ ์ด์ ์งํํ์ง ๋ชปํ๋ ๊ฒฝ์ฐ๊ฐ ์๊ธธ ์ ์์ต๋๋ค.
์๋ฅผ๋ค์ด
(0,0)์์ bfs๋ฅผ ์ํํ๋ฉด (0,1) (1,0) (1,2)๊ฐ ๋ฐฉ๋ฌธ์ฒดํฌ ๋๊ณ ํ์ ๋ค์ด๊ฐ๋๋ค.
์ฌ๊ธฐ์ ํ ํด ๋ bfs๋ฅผ ์ํํ๋ฉด
ํ์ (1,1)์ด ๋ค์ด๊ฐ๊ฒ ๋ฉ๋๋ค.
(1,1)์์ (1,2)๋ก ์ด๋ํ ์ ์์ด์ผ ํ์ง๋ง, ์ด์ ์ ๋ง๋ก ์ด๋ํ๋ (1,2) ๊ฐ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ ๋์ด ์์ด ์ด๋ํ์ง ๋ชปํ๊ฒ ๋ฉ๋๋ค. (์๋ ๊ทธ๋ฆผ์ฒ๋ผ)
๋ฐ๋ผ์ visited[][][] ์ ๊ฐ์ด 3์ฐจ์ ๋ฐฐ์ด์ ํ์ฉํด์ ๋ง ์ด๋์ 0๋ฒ ์ฌ์ฉํ ๊ฒฝ์ฐ์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ, ๋ง ์ด๋์ 1๋ฒ ์ฌ์ฉํ ๊ฒฝ์ฐ์ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ, 2๋ฒ .. ๊ณผ ๊ฐ์ด ํด์ค์ผ ํฉ๋๋ค.
๋ฐฐ์ด์
bfs ํ์ฉ ์ต๋จ๊ฒฝ๋ก๋ฅผ ํ์ ๋ฌธ์ ์์๋ ์ด๋๋ฐฉ๋ฒ์ด ๊ฐ์์ง ๋ค๋ฅธ์ง์ ๋ฐ๋ผ ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฅผ ๋ค๋ฅด๊ฒ ํด์ค์ผ ํ๋ค๋ ๊ฑธ ๋ฐฐ์ธ ์ ์์๋ ๋ฌธ์ ์๋ค. (์ด๋ฒ ๋ฌธ์ ์์๋ ์ด๋๋ฐฉ๋ฒ์ด (์ํ์ข์ฐ ๊ทธ๋ฅ ์ด๋, ๋ง ์ด๋)์ผ๋ก ๋ ๊ฐ์ง)
์ ์ฒด์ฝ๋
package com.mincheolsong;
import java.io.*;
import java.util.*;
public class Main {
static final int INF = (int)1e9;
static int K;
static int H,W; // H * W ๋ฐฐ์ด
static int[][] map;
static boolean[][][] visited;
static int[] dr = {-1,0,1,0,-2,-2,-1,-1,1,1,2,2};
static int[] dc = {0,1,0,-1,-1,1,-2,2,-2,2,-1,1};
static int ans;
static void solve(){
Deque<int[]> q = new ArrayDeque<>();
q.offer(new int[]{0,0,0}); // (ํ,์ด,๋ง ์ด๋ํ์)
visited[0][0][0] = true;
int tmp = -1; // ์ด๋ ๊ฒฝ๋ก์ ๊ธธ์ด
while(!q.isEmpty()){
int size = q.size(); // bfs๋ฅผ ํ ํด์ฉ ์ํ (ํ์ ์ฌ์ด์ฆ ๋งํผ)
tmp+=1; // ์ด๋๊ฒฝ๋ก + 1
for(int s=0;s<size;s++){ // bfs ํ ํด์ฉ ์ํ
int[] cur = q.pollFirst();
int cr = cur[0]; // ํ
int cc = cur[1]; // ์ด
int kMv = cur[2]; // ๋ง๋ก ์ด๋ํ ํ์
if(cr==H-1 && cc==W-1){ // ๋ชฉ์ ์ง์ ๋๋ฌํ์ผ๋ฉด ์ต๋จ๊ฒฝ๋ก (bfs์ด๊ธฐ ๋๋ฌธ์)
ans = tmp;
return;
}
for(int d=0;d<4;d++){ // ๊ทธ๋ฅ ์ด๋
int nr = cr + dr[d];
int nc = cc + dc[d];
if(nr<0 || nr>=H) continue;
if(nc<0 || nc>=W) continue;
if(map[nr][nc]==1) continue;
if(visited[nr][nc][kMv]) continue;
visited[nr][nc][kMv]=true;
q.offer(new int[]{nr,nc,kMv});
}
if(kMv >= K) continue;
for(int d=4;d<12;d++){ // ๋ง๋ก ์ด๋
int nr = cr + dr[d];
int nc = cc + dc[d];
if(nr<0 || nr>=H) continue;
if(nc<0 || nc>=W) continue;
if(map[nr][nc]==1) continue;
if(visited[nr][nc][kMv+1]) continue; // ๋ค์ ๋ง๋ก ๋ฐฉ๋ฌธํ ์์น ํ์ธ
visited[nr][nc][kMv+1]=true;
q.offer(new int[]{nr,nc,kMv+1});
}
}
}
}
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = null;
K = Integer.parseInt(br.readLine());
st = new StringTokenizer(br.readLine());
W = Integer.parseInt(st.nextToken());
H = Integer.parseInt(st.nextToken());
map = new int[H][W];
visited = new boolean[H][W][K+1];
ans = -1;
for(int i=0;i<H;i++){
st = new StringTokenizer(br.readLine());
for(int j=0;j<W;j++){
map[i][j] = Integer.parseInt(st.nextToken());
}
}
solve();
System.out.println(ans);
}
}
'๐์ฝ๋ฉํ ์คํธ:CodingTest' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[ํ๋ก๊ทธ๋๋จธ์ค] ๋ฐฉ์ ๊ฐ์ (0) | 2024.03.29 |
---|---|
์ด๋ถํ์ (0) | 2024.03.06 |
์ด๋ถ ๊ทธ๋ํ (๋ฐฑ์ค 1707) (0) | 2024.02.22 |
DFS + DP (๋ฐฑ์ค 1520 ๋ด๋ฆฌ๋ง๊ธธ) (0) | 2024.02.20 |
๊ตฌํ, ๋ฐฑํธ๋ํน (15684 ์ฌ๋ค๋ฆฌ ์กฐ์) (0) | 2024.02.16 |