Notice
Recent Posts
Recent Comments
Link
«   2024/05   »
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
Tags
more
Archives
Today
Total
관리 메뉴

도누쓰코딩죽이기

정올[1082] - 화염에서 탈출 본문

알고리즘

정올[1082] - 화염에서 탈출

차도누 2020. 2. 19. 11:22

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=362&sca=3040

 

JUNGOL | 화염에서탈출(SLIKAR) > 문제은행

입력의 첫번째 줄에는 50이하의 정수인 R과 C가 입력된다. 다음 줄 부터 지도가 입력되며, 이는 R개의 줄로 이뤄져있다. 각 R개의 줄에는 C개의 문자가 입력된다. 지도에는 정확히 하나의 용사의 집과 하나의 시작 위치가 입력된다.

www.jungol.co.kr

문제 해석

재우의 위치는 'S'로 표시
불은 '*' 로 표시
바위는 'X'로 표시
문제의 재우와 불은 (상,하,좌,우)로만 이동하게 된다.
이동시간과 불의 이동경로를 int 값으로 입력받을 수 있는 visit 2차원 배열을 만들었다.
재우와 불은 동시에 퍼지고 테스트케이스마다 불은 여러군데 있을 수 있기 때문에
전체 배열을 탐색하면서 Queue에 넣는 작업을 했다.

전체 코드

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.util.LinkedList;
import java.util.StringTokenizer;

public class Main_1082_화염에서탈출 {
    static int R, C, endR, endC;
    static char map[][];
    static int visit[][];
    static int dir[][] = { { -1, 0 }, { 1, 0 }, { 0, -1 }, { 0, 1 } };

    public static void main(String[] args) throws Exception {
        System.setIn(new FileInputStream("res/bfs/1082.txt"));
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(in.readLine().trim());
        R = Integer.parseInt(st.nextToken());
        C = Integer.parseInt(st.nextToken());
        map = new char[R][C];
        visit = new int[R][C];
        for (int i = 0; i < R; i++) {
            map[i] = in.readLine().trim().toCharArray();
        }

        LinkedList<int[]> queue = new LinkedList<>();
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {

                if (map[i][j] == '*') {
                    visit[i][j] = -1;
                    queue.add(new int[] { i, j });
                }
                if (map[i][j] == 'D') {
                    endR = i;
                    endC = j;
                }
            }
        }
        for (int i = 0; i < R; i++) {
            for (int j = 0; j < C; j++) {
                if (map[i][j] == 'S') {
                    visit[i][j] = 1;
                    queue.add(new int[] { i, j });
                }
            }
        }

        while (!queue.isEmpty()) {
            int cur[] = queue.poll();
            char a = map[cur[0]][cur[1]];
            if (a == 'S') {
                for (int i = 0; i < 4; i++) {
                    int nr = cur[0] + dir[i][0];
                    int nc = cur[1] + dir[i][1];
                    if (nr >= 0 && nc >= 0 && nr < R && nc < C && (map[nr][nc] == '.' || map[nr][nc] == 'D')
                            && visit[nr][nc] == 0) {
                        visit[nr][nc] = visit[cur[0]][cur[1]] + 1;
                        map[nr][nc] = 'S';
                        queue.add(new int[] { nr, nc });
                    }
                }
            } else if (a == '*') {
                for (int i = 0; i < 4; i++) {
                    int nr = cur[0] + dir[i][0];
                    int nc = cur[1] + dir[i][1];
                    if (nr >= 0 && nc >= 0 && nr < R && nc < C && map[nr][nc] == '.' && visit[nr][nc] == 0) {
                        visit[nr][nc] = -1;
                        map[nr][nc] = '*';
                        queue.add(new int[] { nr, nc });
                    }
                }
            }
        }
        int answer=0;
        if (visit[endR][endC] == 0) {
            answer = -1;
        } else 
            answer = visit[endR][endC] - 1;


        if (answer == (-1)) {
            System.out.println("impossible");
        } else
            System.out.println(answer);

    }

}

느낀점

좀 더 쉽게 풀 수 있었던 거 같은데 아직 초보라 이게 최선인 듯 하다 ㅠㅠ
나중에 더 익숙해지면 다시 풀어봐야지
제출할 때 패키지명을 안지워서 런타임에러가 떴다... 10분간 고생했다ㅜㅜㅜ

'알고리즘' 카테고리의 다른 글

SWEA[6900] - 주혁이의 복권당첨  (0) 2020.02.20