반응형
01-27 20:45
Today
Total
«   2025/01   »
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
관리 메뉴

개발하는 고라니

[백준] 17836번 : 공주님을 구해라! 본문

Programming/백준

[백준] 17836번 : 공주님을 구해라!

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

17836번: 공주님을 구해라!

용사는 마왕이 숨겨놓은 공주님을 구하기 위해 (N, M) 크기의 성 입구 (1,1)으로 들어왔다. 마왕은 용사가 공주를 찾지 못하도록 성의 여러 군데 마법 벽을 세워놓았다. 용사는 현재의 가지고 있는

www.acmicpc.net


[BFS]

우리는 생각해야한다. '그람'을 얻었을 때와 얻지 않았을 때의 visit를. 즉 visit는 3차원 배열로 선언했다. 이동한 횟수 move 또한 3차원 배열로 만들 수 있으나, 그냥 Queue의 원소로 넘겨주었다. 따라서 Queue의 원소에 들어가는 값은 총 4가지이다.

    static class Point{
        int y, x, find, move;
        
        public Point(int yy, int xx, int find, int move){
            y=yy;
            x=xx; 
            this.find = find; 
            this.move = move;
        }
    }
    //y x : 좌표
    //find : 그람 습득 여부 (0이면 없을 때, 1이면 있을 때
    //move : 이동횟수

맵의 값 중 '2'를 만났을 때 부터 벽을 마음껏 뚫을 수 있다.

 

그리고 다음 정점을 방문할 수 있는지에 대한 조건이 까다로우니 잘 짚고 넘어가자.

//좌표가 범위를 벗어날 때
//이미 방문한 정점
//이동 횟수가 k를 넘을 때
//그람이 없으며 벽(1)을 만났을 때
if(ny < 1 || nx < 1 || ny > r || nx > c || visit[ny][nx][find] || nMove > t) continue;

if(find == 0 && map[ny][nx] == 1) continue;

# Code </>

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.*;

public class Main {

    static class Point{
        int y, x, find, move;
        public Point(int yy, int xx, int find, int move){
            y=yy; x=xx; this.find = find; this.move = move;
        }
    }
    static int r,c,t;
    static int[] Y = {-1, 1, 0, 0}, X = {0, 0, -1, 1};
    static int[][] map = new int[101][101];
    static boolean[][][] visit = new boolean[101][101][2];

    static int BFS(){

        Queue<Point> Q = new LinkedList<>();
        int result = 100000000;
        visit[1][1][0] = true;

        Q.add(new Point(1,1, 0, 0));

        while(!Q.isEmpty()){
            Point p = Q.poll();
            int y = p.y;
            int x = p.x;
            int move = p.move;
            int find = p.find;

            if(y == r && x == c)
                result = Math.min(result, move);

            for(int a=0; a<4; a++){
                int ny = y+Y[a];
                int nx = x+X[a];
                int nMove = move + 1;

                if(ny < 1 || nx < 1 || ny > r || nx > c || visit[ny][nx][find] || nMove > t) continue;
                if(find == 0 && map[ny][nx] == 1) continue;

                visit[ny][nx][find] = true;
                Q.add(new Point(ny, nx, find, nMove));

                if(map[ny][nx] == 2){
                    visit[ny][nx][1] = true;
                    Q.add(new Point(ny, nx, 1, nMove));
                }
            }
        }
        return result;
    }

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

        r = Integer.parseInt(st.nextToken());
        c = Integer.parseInt(st.nextToken());
        t = Integer.parseInt(st.nextToken());

        for(int i=1; i<=r; i++){
            st = new StringTokenizer(br.readLine());
            for(int j=1; j<=c; j++)
                map[i][j] = Integer.parseInt(st.nextToken());
        }
        int result = BFS();
        System.out.println(result != 100000000? result : "Fail");
    }
}
반응형

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

[백준] 16397번 : 탈출  (0) 2021.03.17
[백준] 16118번 : 달빛 여우  (0) 2021.03.16
[백준] 11779번 : 최소비용 구하기 2  (0) 2021.03.15
[백준] 2668번 : 숫자고르기  (0) 2021.03.15
[백준] 13565번 : 침투  (0) 2021.03.14
Comments