본문 바로가기

OJ

[BOJ] 16441 아기돼지와 늑대 (JAVA)

https://www.acmicpc.net/problem/16441

 

16441번: 아기돼지와 늑대

첫 번째 줄에는 격자의 행의 수를 나타내는 N (3 ≤ N ≤ 100) 과 격자의 열의 수를 나타내는 M (3 ≤ M ≤ 100) 이 주어집니다. 두 번째 줄부터 N개의 줄에 지도의 정보를 나타내는 길이가 M인 문자열

www.acmicpc.net

BFS 문제입니다.

얼음을 어떻게 미끄러져 갈 것인가, 그 후에 어떻게 할 것인가가 중요한 것 같습니다.

 

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

public class Main {

    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    static StringBuilder sb = new StringBuilder();
    static StringTokenizer st;
    static int N, M;
    static char[][] map;
    static boolean[][] visited;
    static int[] dr = { -1,  0,  1,  0 };
    static int[] dc = {  0,  1,  0, -1 };
    static Queue<int[]> q = new LinkedList<>();

    public static void main(String[] args) throws Exception {

        st = new StringTokenizer(br.readLine(), " ");
        N = Integer.parseInt(st.nextToken());
        M = Integer.parseInt(st.nextToken());
        map = new char[N][M];
        visited = new boolean[N][M];
        for (int i = 0; i < N; i++) {
            String line = br.readLine();
            for (int j = 0; j < M; j++) {
                map[i][j] = line.charAt(j);
                if(map[i][j] == 'W') {
                    visited[i][j] = true;
                    q.offer(new int[] { i, j });
                }
            }
        } // end of input

        while(!q.isEmpty()) {

            int[] now = q.poll();

            for (int dir = 0; dir < 4; dir++) {

                int nr = now[0] + dr[dir];
                int nc = now[1] + dc[dir];

                if(map[nr][nc] == '.' && !visited[nr][nc]) {

                    visited[nr][nc] = true;
                    q.offer(new int[] { nr, nc });

                } else if(map[nr][nc] == '+') {

                    while(true) {

                        nr += dr[dir];
                        nc += dc[dir];

                        if(map[nr][nc] == '.') {

                            if(visited[nr][nc]) break;

                            visited[nr][nc] = true;
                            q.offer(new int[] { nr, nc });
                            break;

                        } else if(map[nr][nc] == '#') {

                            nr -= dr[dir];
                            nc -= dc[dir];

                            if(visited[nr][nc]) break;

                            visited[nr][nc] = true;
                            q.offer(new int[] { nr, nc });
                            break;

                        }

                    }

                }

            }

        }

        // 출력
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < M; j++) {
                if(map[i][j] == '#' || map[i][j] == '+' || map[i][j] == 'W') sb.append(map[i][j]);
                else if(map[i][j] == '.' && visited[i][j]) sb.append('.');
                else sb.append('P');
            }
            sb.append("\n");
        }
        System.out.print(sb.toString());

    }
	
}