๐ ๋ฌธ์
https://www.acmicpc.net/problem/14442
๋ฌธ์
N×M์ ํ๋ ฌ๋ก ํํ๋๋ ๋งต์ด ์๋ค. ๋งต์์ 0์ ์ด๋ํ ์ ์๋ ๊ณณ์ ๋ํ๋ด๊ณ , 1์ ์ด๋ํ ์ ์๋ ๋ฒฝ์ด ์๋ ๊ณณ์ ๋ํ๋ธ๋ค. ๋น์ ์ (1, 1)์์ (N, M)์ ์์น๊น์ง ์ด๋ํ๋ ค ํ๋๋ฐ, ์ด๋ ์ต๋จ ๊ฒฝ๋ก๋ก ์ด๋ํ๋ ค ํ๋ค. ์ต๋จ๊ฒฝ๋ก๋ ๋งต์์ ๊ฐ์ฅ ์ ์ ๊ฐ์์ ์นธ์ ์ง๋๋ ๊ฒฝ๋ก๋ฅผ ๋งํ๋๋ฐ, ์ด๋ ์์ํ๋ ์นธ๊ณผ ๋๋๋ ์นธ๋ ํฌํจํด์ ์ผ๋ค.
๋ง์ฝ์ ์ด๋ํ๋ ๋์ค์ ๋ฒฝ์ ๋ถ์๊ณ ์ด๋ํ๋ ๊ฒ์ด ์ข ๋ ๊ฒฝ๋ก๊ฐ ์งง์์ง๋ค๋ฉด, ๋ฒฝ์ K๊ฐ ๊น์ง ๋ถ์๊ณ ์ด๋ํ์ฌ๋ ๋๋ค.
ํ ์นธ์์ ์ด๋ํ ์ ์๋ ์นธ์ ์ํ์ข์ฐ๋ก ์ธ์ ํ ์นธ์ด๋ค.
๋งต์ด ์ฃผ์ด์ก์ ๋, ์ต๋จ ๊ฒฝ๋ก๋ฅผ ๊ตฌํด ๋ด๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000), K(1 ≤ K ≤ 10)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์ M๊ฐ์ ์ซ์๋ก ๋งต์ด ์ฃผ์ด์ง๋ค. (1, 1)๊ณผ (N, M)์ ํญ์ 0์ด๋ผ๊ณ ๊ฐ์ ํ์.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ์ต๋จ ๊ฑฐ๋ฆฌ๋ฅผ ์ถ๋ ฅํ๋ค. ๋ถ๊ฐ๋ฅํ ๋๋ -1์ ์ถ๋ ฅํ๋ค.
โ๏ธ ํ์ด
๋ฒฝ ๋ถ์๊ณ ์ด๋ํ๊ธฐ(https://www.acmicpc.net/problem/2206) ์ฒซ ๋ฒ์งธ ๋ฌธ์ ์ ๊ฑฐ์ ์ ์ฌํ๋ค.
์ฒซ ๋ฒ์งธ ๋ฌธ์ ๋ฅผ ๋จผ์ ํ๊ณ ์๋๋ ๊ทธ๋ฅ ์์ค์ฝ๋๋ฅผ ์กฐ๊ธ ์์ ํ๋ ์ ๋..?
๐ก 3์ฐจ์ ๋ฐฐ์ด์ ์ฌ์ฉํ๋ ๊ฒ์ด ํต์ฌ์ด๋ค.
์ด๋ฏธ ํ ๋ฒ ์ง๋์จ ๊ธธ์ด๋ผ๋, ๋ฒฝ์ ๋ถ์๊ณ ๋ค์ ๋ฐฉ๋ฌธํ ์ ์์ผ๋ฏ๋ก ๋ฐฉ๋ฌธ์ฒ๋ฆฌ๋ฐฐ์ด์ ๋ฒฝ์ ๋ถ์ ํ์๊น์ง ํจ๊ป ๋ด๋๋ก 3์ฐจ์์ผ๋ก ๋์ด์ผํ๋ค.
โ๏ธ ํน์ ์์น์์ ์ฌ๋ฐฉํ์์ ํ์ฌ BFS๋ก ์ด๋์ ํ ๋
1. ๋ฒฝ์ด ์๋ ์์น๋ผ๋ฉด: ๊ทธ๋ฅ ์ด๋ํ๋ค.
2. ๋ฒฝ์ ๋ง๋ฌ๋๋ฐ ๋ถ์ ์ ์๋ ํ์๊ฐ ๊ฝ ์ฐผ๋ค๋ฉด: ๋์ด๊ฐ๋ค.
2. ๋ฒฝ์ ๋ง๋ฌ๊ณ ๋ถ์ ์ ์๋ ํ์๊ฐ ์์ง ๋จ์๋ค๋ฉด: ๋ฒฝ์ ๋ถ์๊ณ ์ด๋ํ๋ค.
๐ป ์์ค์ฝ๋: ์๋ฐ(Java)
public class Main_๋ฐฑ์ค_14442_๋ฒฝ๋ถ์๊ณ ์ด๋ํ๊ธฐ2_๊ณจ๋3 {
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());
int K = Integer.parseInt(st.nextToken());//๋ถ์ ์ ์๋ ๋ฒฝ ๊ฐ์
int[][] map = new int[N][M];
for (int i = 0; i < N; i++) {
String str = br.readLine();
for (int j = 0; j < M; j++) {
map[i][j] = str.charAt(j)-'0';
}
}//input
int result = -1;
int[] dr = {1,-1,0,0};
int[] dc = {0,0,1,-1};
Queue<int []> queue = new LinkedList<int[]>();
boolean[][][] visited = new boolean[N][M][K+1];
//์์์์น
visited[0][0][0] = true;
//r,c,d,k
queue.offer(new int[] {0,0,1,0});
while(queue.size()>0) {//BFS
int[] cur = queue.poll();
int r = cur[0];
int c = cur[1];
int d = cur[2];
int k = cur[3];
// ๋ชฉ์ ์ง์ ๋๋ฌ
if(r==N-1 && c==M-1) {
result = d;
break;
}
// ์ฌ๋ฐฉํ์
for (int i = 0; i < 4; i++) {
int nr = r + dr[i];
int nc = c + dc[i];
if(nr<0||nc<0||nr>=N||nc>=M|| visited[nr][nc][k]) continue;
if(map[nr][nc]==0) {//๋ฒฝ์ ์ ๋ถ์ ๋
visited[nr][nc][k]=true;
queue.offer(new int[] {nr,nc,d+1,k});
}
// ๋ฒฝ์ ๋ถ์ ๊ธฐํ๊ฐ ๋จ์๊ณ && ๋ถ์ด๋ ๋ฐฉ๋ฌธํ ์ ์ด ์๋ ๋
else if(k<K && !visited[nr][nc][k+1]) {
visited[nr][nc][k+1] = true;
queue.offer(new int[] {nr,nc,d+1,k+1});
}
}
}
System.out.println(result);
}//end of main
}//end of class
๐ ๐ ๐
๏ผฐ๏ฝ๏ฝ๏ฝ๏ฝ ๏ฝ ๏ผข๏ฝ ๏ผณ๏ผก๏ผน
๐๐ฉ๐ข๐ฏ๐ฌ๐ด ๐ง๐ฐ๐ณ ๐ณ๐ฆ๐ข๐ฅ๐ช๐ฏ๐จ