Life Engineering
[BOJ 14442] 벽 부수고 이동하기 2 (Java) 본문
https://www.acmicpc.net/problem/14442
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;
public class Main_BOJ_14442 {
static int[] dr= {-1,1,0,0};
static int[] dc= {0,0,-1,1};
static int[][] map;
static int[][][] visited;
static int N, M, K;
static int answer=-1;
public static void main(String[] args) throws IOException {
BufferedReader br=new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st=new StringTokenizer(br.readLine());
N=Integer.parseInt(st.nextToken());
M=Integer.parseInt(st.nextToken());
K=Integer.parseInt(st.nextToken());
map=new int[N+1][M+1];
visited=new int[N+1][M+1][K+1];
for (int i=1; i<=N; i++) {
String s=br.readLine();
for (int j = 1; j <=M; j++) {
map[i][j]=s.charAt(j-1)-'0';
for (int k=0; k<K+1; k++) {
visited[i][j][k]=-1;
}
}
}
bfs();
System.out.println(answer);
}
private static void bfs() {
Queue<int[]> q=new LinkedList<>();
q.add(new int[] {1,1,0});
visited[1][1][0]=1;
while (!q.isEmpty()) {
int[] curr=q.poll();
int r=curr[0];
int c=curr[1];
int broken=curr[2];
if (r==N && c==M) {
answer=visited[r][c][broken];
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) continue;
if (map[nr][nc]==0 && visited[nr][nc][broken]==-1) {
visited[nr][nc][broken]=visited[r][c][broken]+1;
q.add(new int[] {nr, nc, broken});
}
else if (broken<K && map[nr][nc]==1 && visited[nr][nc][broken+1]==-1) {
visited[nr][nc][broken+1]=visited[r][c][broken]+1;
q.add(new int[] {nr, nc, broken+1});
}
}
}
}
}
3차원 방문 배열을 이용하는 문제
'Problem Solving' 카테고리의 다른 글
[SWEA 1767] 프로세서 연결하기 (Java) (0) | 2022.04.04 |
---|---|
[BOJ 1175] 배달 (Java) (0) | 2022.04.04 |
[BOJ 20057] 마법사 상어와 토네이도 (Java) (0) | 2022.04.01 |
[BOJ 1194] 달이 차오른다, 가자. (Java) (0) | 2022.04.01 |
[BOJ 4485] 녹색 옷 입은 애가 젤다지? (Java) (0) | 2022.04.01 |