Problem Solving
[BOJ 14442] 벽 부수고 이동하기 2 (Java)
흑개1
2022. 4. 3. 21:59
https://www.acmicpc.net/problem/14442
14442번: 벽 부수고 이동하기 2
첫째 줄에 N(1 ≤ N ≤ 1,000), M(1 ≤ M ≤ 1,000), K(1 ≤ K ≤ 10)이 주어진다. 다음 N개의 줄에 M개의 숫자로 맵이 주어진다. (1, 1)과 (N, M)은 항상 0이라고 가정하자.
www.acmicpc.net
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차원 방문 배열을 이용하는 문제