π [λ°±μ€μκ³ λ¦¬μ¦ νμ΄] Q.2206 λ²½ λΆμκ³ μ΄λνκΈ° λ¬Έμ νμ΄ - java
π λ¬Έμ
https://www.acmicpc.net/problem/2206
NΓMμ νλ ¬λ‘ ννλλ λ§΅μ΄ μλ€. 맡μμ 0μ μ΄λν μ μλ κ³³μ λνλ΄κ³ , 1μ μ΄λν μ μλ λ²½μ΄ μλ κ³³μ λνλΈλ€.
λΉμ μ (1, 1)μμ (N, M)μ μμΉκΉμ§ μ΄λνλ € νλλ°, μ΄λ μ΅λ¨ κ²½λ‘λ‘ μ΄λνλ € νλ€. μ΅λ¨κ²½λ‘λ 맡μμ κ°μ₯ μ μ κ°μμ μΉΈμ μ§λλ κ²½λ‘λ₯Ό λ§νλλ°,
μ΄λ μμνλ μΉΈκ³Ό λλλ μΉΈλ ν¬ν¨ν΄μ μΌλ€.
λ§μ½μ μ΄λνλ λμ€μ ν κ°μ λ²½μ λΆμκ³ μ΄λνλ κ²μ΄ μ’ λ κ²½λ‘κ° μ§§μμ§λ€λ©΄, λ²½μ ν κ° κΉμ§ λΆμκ³ μ΄λνμ¬λ λλ€.
ν μΉΈμμ μ΄λν μ μλ μΉΈμ μνμ’μ°λ‘ μΈμ ν μΉΈμ΄λ€.
λ§΅μ΄ μ£Όμ΄μ‘μ λ, μ΅λ¨ κ²½λ‘λ₯Ό κ΅¬ν΄ λ΄λ νλ‘κ·Έλ¨μ μμ±νμμ€.
π μ κ·Όλ²
Q.2206 λ²½ λΆμκ³ μ΄λνκΈ° λ¬Έμ μ λλ€. (1,1) μμ (N,M) μ λͺ©μ μ§ κΉμ§ μ΄λνλ € ν λ
μ΅λ¨ κ²½λ‘λ₯Ό ꡬνλ λ¬Έμ μ λλ€.
μ΄λν λ κ°μ€μΉκ° μλ κ·Έλνμ΄λ―λ‘ μ΅λ¨ κ²½λ‘λ₯Ό ꡬνκΈ° μν΄
BFS νμμ ν΅ν΄ ꡬν μ μμ΅λλ€.
νμ§λ§, μ΄ λ¬Έμ λ λ¨ νλ² λ²½μ λΆμκ³ κ° μκ° μμ΅λλ€.
κ·Έλμ λ²½μ λΆμκ³ κ°λ κ²½μ°μ λ²½μ λΆμμ§ μλ κ²½μ°λ₯Ό λλ νμ΄κ° κ°λ₯ν©λλ€.
κΈ°μ‘΄μ 2μ°¨μ λ°°μ΄λ‘ visitedλ₯Ό νμΈνλ€λ©΄
μ΄μ 3μ°¨μ λ°°μ΄μ ν΅ν΄ λ²½μ λΆμ κ²½μ°μ μ λΆμ κ²½μ°κΉμ§ νμΈν΄μ€λλ€.
bfs νμμ νμ¬
νμμ κΊΌλΈ μμΉκ° (n,m) μ΄λΌλ©΄
ν΄λΉ μμΉμ μ΅λ¨κ²½λ‘λ₯Ό μΆλ ₯ν΄μ£Όλ©΄ λ©λλ€.
π» μ½λ
package problem.bfsdfs;
import java.io.*;
import java.util.LinkedList;
import java.util.Queue;
public class Main_2206 {
static int n,m;
static boolean [][][] visited;
static int [][] maze;
static int moveX[] = {0,0,-1,1};
static int moveY[] = {-1,1,0,0};
static int distance[][];
public static void main(String[] args) throws IOException {
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
input();
solve();
bw.flush();
bw.close();
}
public static void input() throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String [] input = br.readLine().split(" ");
n = Integer.parseInt(input[0]);
m = Integer.parseInt(input[1]);
visited = new boolean[n][m][2];
maze = new int[n][m];
distance = new int[n][m];
for(int i=0; i<n; i++){
String temp[] = br.readLine().split("");
for(int j=0; j<m; j++){
maze[i][j] = Integer.parseInt(temp[j]);
}
}
}
public static void solve () {
Queue<int[]> queue = new LinkedList();
queue.offer(new int[]{0, 0,0});
visited[0][0][0] = true;
distance[0][0] = 1;
while (!queue.isEmpty()){
int coordinate[] = queue.poll();
if(coordinate[0] == n-1 && coordinate[1] == m-1 ){
System.out.println(distance[coordinate[0]][coordinate[1]]);
return;
}
for(int i=0; i<4; i++){
int x = coordinate[0] + moveX[i];
int y = coordinate[1] + moveY[i];
int num = coordinate[2];
if ( x < 0 || y< 0 || x>=n || y>=m) {
continue;
}
if ( maze[x][y] == 1 ){
if( num==0 && !visited[x][y][1] ){
queue.offer(new int[]{x,y,1});
visited[x][y][1] = true;
distance[x][y] = distance[coordinate[0]][coordinate[1]] +1;
}
}
else {
if(visited[x][y][num]) {
continue;
}
queue.offer(new int[]{x,y,num});
visited[x][y][num] = true;
distance[x][y] = distance[coordinate[0]][coordinate[1]] +1;
}
}
}
System.out.println(-1);
}
}