Notice
Recent Posts
Recent Comments
Link
«   2024/09   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30
Archives
Today
Total
관리 메뉴

Life Engineering

[BOJ 14442] 벽 부수고 이동하기 2 (Java) 본문

Problem Solving

[BOJ 14442] 벽 부수고 이동하기 2 (Java)

흑개 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차원 방문 배열을 이용하는 문제