[BOJ]14442 벽 부수고 이동하기 2.java

전영서·2021년 9월 24일
0

Algorithm

목록 보기
57/89

1.문제

2.코드

package prac;

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.util.LinkedList;
import java.util.Queue;
import java.util.StringTokenizer;

/**
 * Author : YoungSeo Jeon
 * Date : 2021-09-24
 * Description : 백준
 */


public class Main{
	static int C,R;
	
	public static class Person{
		int y,x,k;
		
		Person(int y,int x, int k){
			this.y = y;
			this.x = x;
			this.k = k;
		}
	}
	
    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        
        StringTokenizer st = new StringTokenizer(br.readLine());
        
        int H = Integer.parseInt(st.nextToken());
        int W = Integer.parseInt(st.nextToken());
        int K = Integer.parseInt(st.nextToken());
        
        
        int[][] board = new int[H][W];
        boolean[][][] visited = new boolean[K+1][H][W];
        
        for(int i=0; i<H; i++) {
        	String str = br.readLine();
        	for(int j=0; j<W; j++) {
        		board[i][j] = str.charAt(j)-'0';
        	}
        }
        
        Queue<Person> queue = new LinkedList<Person>();
        
        queue.add(new Person(0,0,0));
        
        int[] move_y = {-1,1,0,0};
        int[] move_x = {0,0,1,-1};
        
        int count = 1;
        while(!queue.isEmpty()) {
        	int num = queue.size();
        	
        	while(num != 0) {
        		Person person = queue.poll();
        		int y = person.y;
        		int x = person.x;
        		int k = person.k;
        		
        		if(y==H-1 && x==W-1) {
        			System.out.println(count);
        			return;
        		}
        		
        		for(int i=0; i<4; i++) {
        			int new_y = y+move_y[i];
        			int new_x = x+move_x[i];
        			if(new_y>=0 && new_y<H && new_x>=0 && new_x<W && !visited[k][new_y][new_x] && board[new_y][new_x]==0) {
        				queue.add(new Person(new_y, new_x, k));
        				visited[k][new_y][new_x] = true;
        			}
        		}
        		
        		if(k!=K) {
        			k++;
	        		for(int i=0; i<4; i++) {
	        			int new_y = y+move_y[i];
	        			int new_x = x+move_x[i];
	        			if(new_y>=0 && new_y<H && new_x>=0 && new_x<W && board[new_y][new_x]==1 && !visited[k][new_y][new_x]) {
	        				queue.add(new Person(new_y, new_x, k));
	        				visited[k][new_y][new_x] = true;
	        				visited[k][y][x] = true;
	        				
	        			}
	        		}
        		}
        		
        		num --;
        	}
        	
        	count ++;
        }
        
        System.out.println(-1);
        bw.flush();
        bw.close();
        br.close();
    }
    
}

3.Review

일반적인 BFS문제와 비슷하다 .. 그러나 벽을 몇개 부쉇는지의 여부에 따라 방문배열을 달리 해주어야 하고 체크도 따로 해주어야 한다.

profile
꾸준히 성실하게

0개의 댓글