https://www.acmicpc.net/problem/2206
βοΈ λ¬Έμ
π λ¬Έμ ν΄κ²°
μλ₯Όλ€μ΄ μλμ κ°μ 5X5 λ°°μ΄μ΄ μλ€κ³ ν΄λ³΄μ
0 0 0 0 0
1 1 1 0 1
0 0 0 0 1
0 1 1 1 1
0 0 0 1 0
κ·Έλ¦ΌμΌλ‘ νμνλ©΄ μλμ κ°μ κ²μ΄λ€.
νμ΄ν λ°©ν₯κ³Ό κ°μ΄ μμμ (0,0) μμλ λ κ°μ§ λ°©ν₯μΌλ‘ κ° μ μμ κ²μ΄λ€.
νμ§λ§ 1λ²μΌλ‘ λ²½μ λ«κ³ κ°λ€λ©΄, μλμ λ¬Έμ μ μ λΆλͺνκ² λλ€.
λμ°©μ§μ μΌλ‘ κ°κΈ° μν΄μλ λ²½(λΉ¨κ° μ§μ )μ λΆμ΄μΌ νλλ°, μ΄λ―Έ λ²½μ λΆμμΌλ―λ‘ κ°μ§ λͺ»νκ² λμ΄ 1λ² λ°©ν₯μ μ λ΅μ΄ μλκ² λλ€.
κ·ΈλΌ 2λ² λ°©ν₯μΌλ‘ μ§νμ νλ€λ©΄? κ°λ κΈΈμ λ²½μ΄ μκΈ° λλ¬Έμ λΉ¨κ° μ§μ κΉμ§λ λλ¬ν μ μμ§λ§, μ΄λ―Έ 1λ² μΌμ΄μ€μμ μ§λκ° κΈΈμ λ°©λ¬Έ νμνκΈ° λλ¬Έμ λλ¬νμ§ λͺ»νκ² λλ€.
κ·Έλ κΈ° λλ¬Έμ, λ²½μ λΆμκ³ μ§ννλ μΌμ΄μ€μ λΆμμ§ μκ³ μ§ννλ μΌμ΄μ€μ λ°©λ¬Έ μ²λ¦¬νλ λ°°μ΄μ νλλ‘ λκ³ μ°λ©΄ μ΄λ¬ν λ¬Έμ μ μ΄ λ°μνλ€.
λ°©λ¬Έ μ²λ¦¬ λ°°μ΄μ μλμ κ°μ΄ μ μΈν΄μ€μΌ νλ€.
// 3μ°¨μ λ°°μ΄ : [λ²½μ λΆμλμ§ 0,1]
boolean[][][] visit = new boolean[2][N][M];
λ€μ μΉΈμΌλ‘ μ΄λν λμ λ²½μ΄ μλμ§ μλμ§μ λ°λΌμ μ²λ¦¬νλ κ³Όμ μ΄ λ€μκ³Ό κ°λ€.
- λ€μ μΉΈμ λ²½μ΄ μμ κ²½μ°
- λ²½μ λΆμμ μ΄ μλμ§ μ²΄ν¬
- ν΄λΉ λ²½μ μ΄μ μ λΆμκ³ λ°©λ¬Έν μ μ΄ μλμ§
- λ€μ μΉΈμ λ²½μ΄ μμ κ²½μ°
- λ²½μ λΆμ μ¬λΆμ λ°λΌ λ€μ μΉΈμ λ°©λ¬Ένλμ§ μ²΄ν¬
μ ννκ² μ΄ν΄κ° λμ§ μλλ€λ©΄ μλμ μ½λλ₯Ό μ°Έκ³ νλ©΄ λλ€.
// λ€μ μΉΈμ λ²½μ΄ μμ λ -> (1) λ²½μ λΆμμ μ΄ μλμ§ μ²΄ν¬
// (2) μ΄μ μ 'ν΄λΉ λ²½'μ λΆμκ³ λ°©λ¬Ένμ μ΄ μλμ§ μ²΄ν¬
if (miro[nX][nY] == '1') {
if(cur[2] == 0 && !visit[1][nX][nY]){
visit[cur[2]][nX][nY] = true; // λ°©λ¬Έ μ²λ¦¬
dist[nX][nY] = dist[cur[0]][cur[1]] + 1; // 거리 μΈ‘μ
qu.offer(new int[]{nX, nY, 1}); // λ€μ νμ λ£μ΄μ€μ BFS!
}
}
// λ²½μ΄ μλ κ²½μ° -> λ²½μ "λΆμ μ¬λΆ"μ λ°λ₯Έ λ°©λ¬Έμ νλμ§ μ²΄ν¬!
else{
if(!visit[cur[2]][nX][nY]){
// ν΄λΉ μΉΈμ λ°©λ¬Έμ μνμ λ!
visit[cur[2]][nX][nY] = true; // λ°©λ¬Έ μ²λ¦¬
dist[nX][nY] = dist[cur[0]][cur[1]] + 1; // 거리 μΈ‘μ
qu.offer(new int[]{nX, nY, cur[2]}); // λ€μ νμ λ£μ΄μ€μ BFS!
}
}
// λμ°©μ§μ μ λλ¬ νμ λ μΆλ ₯νκ³ μ’
λ£!
if(nX == N-1 && nY == M-1){
System.out.print(dist[nX][nY] + 1);
System.exit(0);
}
π₯ μ 체 μ½λ
import java.util.*;
import java.io.*;
public class Main {
public static void main(String[] args) throws IOException {
BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(bf.readLine());
int N = Integer.parseInt(st.nextToken());
int M = Integer.parseInt(st.nextToken());
// μμμ§μ κ³Ό λμ°©μ§μ μ΄ κ°μ κ²½μ°!
if(N-1 == 0 && M-1 == 0){
System.out.print(1);
System.exit(0);
}
int[] dx = {1, 0, -1, 0};
int[] dy = {0, 1, 0, -1};
char[][] miro = new char[N][M]; // λ―Έλ‘ λ°°μ΄
int[][] dist = new int[N][M]; // 거리 μΈ‘μ λ°°μ΄
boolean[][][] visit = new boolean[2][N][M]; // λ²½μ λΆμ μ¬λΆμ λ°λΌ λ°©λ¬Έ μ¬λΆ κΈ°λ‘
Queue<int[]> qu = new LinkedList<>();
for (int i = 0; i < N; i++) {
String s = bf.readLine();
for (int j = 0; j < M; j++) {
miro[i][j] = s.charAt(j);
}
}
// μμμ μΈν
(xμ’ν, yμ’ν, crash μ¬λΆ)
qu.offer(new int[]{0, 0, 0});
while (!qu.isEmpty()) {
int[] cur = qu.poll(); // νμ¬ μμΉ λ½κΈ°
// μ,ν,μ’,μ° νμ
for(int i=0; i<4; i++){
int nX = cur[0] + dx[i];
int nY = cur[1] + dy[i];
if (nX < 0 || nX >= N || nY < 0 || nY >= M) {
continue;
}
// λ€μ μΉΈμ λ²½μ΄ μμ λ -> (1) λ²½μ λΆμμ μ΄ μλμ§ μ²΄ν¬
// (2) κ·Έ λ²½μ λ°©λ¬Ένμ μ΄ μλμ§ μ²΄ν¬
if (miro[nX][nY] == '1') {
if(cur[2] == 0 && !visit[1][nX][nY]){
visit[cur[2]][nX][nY] = true; // λ°©λ¬Έ μ²λ¦¬
dist[nX][nY] = dist[cur[0]][cur[1]] + 1; // 거리 μΈ‘μ
qu.offer(new int[]{nX, nY, 1}); // λ€μ νμ λ£μ΄μ€μ BFS!
}
}
// λ²½μ΄ μλ κ²½μ° -> λ²½μ "λΆμ μ¬λΆ"μ λ°λ₯Έ λ°©λ¬Έμ νλμ§ μ²΄ν¬!
else{
if(!visit[cur[2]][nX][nY]){
// ν΄λΉ μΉΈμ λ°©λ¬Έμ μνμ λ!
visit[cur[2]][nX][nY] = true; // λ°©λ¬Έ μ²λ¦¬
dist[nX][nY] = dist[cur[0]][cur[1]] + 1; // 거리 μΈ‘μ
qu.offer(new int[]{nX, nY, cur[2]}); // λ€μ νμ λ£μ΄μ€μ BFS!
}
}
// λμ°©μ§μ μ λλ¬ νμ λ μΆλ ₯νκ³ μ’
λ£!
if(nX == N-1 && nY == M-1){
System.out.print(dist[nX][nY] + 1);
System.exit(0);
}
}
}
// λλ¬μ λͺ»νμΌλ―λ‘ -1 μΆλ ₯!
System.out.print(-1);
}
}