반응형
12-24 07:02
Today
Total
«   2024/12   »
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 31
관리 메뉴

개발하는 고라니

[백준] 14442번 : 벽 부수고 이동하기 2 본문

Programming/백준

[백준] 14442번 : 벽 부수고 이동하기 2

조용한고라니 2021. 3. 2. 01:01
반응형
 

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


[BFS]

백준의 벽 부수고 이동하기 시리즈 2번째 문제. 1번 문제의 경우 벽을 1개만 부실 수 있었다면 이 문제는 최대 10개를 부실 수 있다. 따라서 1과 유사하게 풀되, 배열의 사이즈를 조금 늘리면 되겠다.

 

int[][][] dist = new int[1001][1001][11];

 

큐에 들어가야할 원소의 개수는 3개이다. 다음 위치의 y좌표, x좌표, 벽을 몇 개 부수었는지. 그래서 만약 다음 위치가 벽이고, 현재 k개 이하로 벽을 부수었다면 (+ visit[ny][nx][crush + 1]을 방문하지 않았다면) 벽을 부수고 이동한다.

파란색으로 색칠한 문장을 구현하지 않아서 TLE를 왕창 만나버렸다.

 

# Code </>

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 {

    static class Point{
        int y, x, crush;
        public Point(int yy, int xx, int cc){
            y=yy; x=xx; crush=cc;
        }
    }
    static int[][][] dist = new int[1001][1001][11];
    static char[][] map = new char[1001][1001];
    static boolean[][][] visit = new boolean[1001][1001][11];
    static int[] Y = {-1, 1, 0, 0}, X = {0, 0, -1, 1};
    static int min = 1000000000;

    static void BFS(int r, int c, int k){

        Queue<Point> Q = new LinkedList<>();

        visit[1][1][0] = true;
        dist[1][1][0] = 1;
        Q.add(new Point(1, 1, 0));

        while(!Q.isEmpty()){
            Point p = Q.poll();

            int crush = p.crush;
            int d = dist[p.y][p.x][crush];
            
            if(p.y == r && p.x == c) {
                min = dist[p.y][p.x][crush];
                break;
            }

            for(int a=0; a<4; a++){
                int ny = p.y+Y[a];
                int nx = p.x+X[a];
                int nd = d + 1;

                if(ny < 1 || nx < 1 || ny > r || nx > c || visit[ny][nx][crush]) continue;

                if(map[ny][nx] == '0') {
                
                    visit[ny][nx][crush] = true;
                    dist[ny][nx][crush] = nd;
                    Q.add(new Point(ny, nx, crush));
                }
                else if(map[ny][nx] == '1' && crush < k && !visit[ny][nx][crush + 1]){
                
                    visit[ny][nx][crush + 1] = true;
                    dist[ny][nx][crush + 1] = nd;
                    Q.add(new Point(ny, nx, crush + 1));
                }

            }
        }
    }

    public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        StringTokenizer st = new StringTokenizer(br.readLine());

        int n = Integer.parseInt(st.nextToken());
        int m = Integer.parseInt(st.nextToken());
        int k = Integer.parseInt(st.nextToken());

        for(int i=1; i<=n; i++){
            char[] str = br.readLine().toCharArray();
            for(int j=1; j<=m; j++)
                map[i][j] = str[j-1];
        }

        BFS(n, m, k);

        System.out.println(min == 1000000000? -1:min);
    }
}
반응형

'Programming > 백준' 카테고리의 다른 글

[백준] 2660번 : 회장뽑기  (0) 2021.03.04
[백준] 2458번 : 키 순서  (0) 2021.03.03
[백준] 11404번 : 플로이드  (0) 2021.02.27
[백준] 1613번 : 역사  (0) 2021.02.26
[백준] 6593번 : 상범 빌딩  (0) 2021.02.22
Comments