백준 16956 늑대와 양 문제풀이 (JAVA)

0

링크텍스트

문제


크기가 R×C인 목장이 있고, 목장은 1×1 크기의 칸으로 나누어져 있다. 각각의 칸에는 비어있거나, 양 또는 늑대가 있다. 양은 이동하지 않고 위치를 지키고 있고, 늑대는 인접한 칸을 자유롭게 이동할 수 있다. 두 칸이 인접하다는 것은 두 칸이 변을 공유하는 경우이다.

목장에 울타리를 설치해 늑대가 양이 있는 칸으로 갈 수 없게 하려고 한다. 늑대는 울타리가 있는 칸으로는 이동할 수 없다. 울타리를 설치해보자.

입력


첫째 줄에 목장의 크기 R, C가 주어진다.
1 <= R, C <=500
둘째 줄부터 R개의 줄에 목장의 상태가 주어진다. '.'는 빈 칸, 'S'는 양, 'W'는 늑대이다.

출력


늑대가 양이 있는 칸으로 갈 수 없게 할 수 있다면 첫째 줄에 1을 출력하고, 둘째 줄부터 R개의 줄에 목장의 상태를 출력한다. 울타리는 'D'로 출력한다. 울타리를 어떻게 설치해도 늑대가 양이 있는 칸으로 갈 수 있다면 첫째 줄에 0을 출력한다.

풀이


늑대 바로 옆에 양이 있으면 늑대가 양을 잡아 먹을 수 있다.
그렇지 않은 경우에는 늑대 상하좌우로 울타리를 설치하면 된다.

소스코드


import java.util.*;
import java.io.*;

//import java.math.BigInteger;
class Main {

    public static void main(String[] args) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));
        StringBuilder sb = new StringBuilder();
        StringTokenizer st = new StringTokenizer(br.readLine());
        final int COLS = Integer.parseInt(st.nextToken());
        final int ROWS = Integer.parseInt(st.nextToken());
        char field[][] = new char[COLS][ROWS];
        for (int i = 0; i < COLS; i++) {
            field[i] = br.readLine().toCharArray();
        }
        boolean noAnswer = false;
        for (int i = 0; i < COLS; i++) {
            for (int j = 0; j < ROWS; j++) {
                if (field[i][j] == 'W') {
                    try {
                        if (field[i - 1][j] == 'S') {
                            noAnswer = true;
                            break;
                        } else if (field[i - 1][j] == 'W') {

                        } else {
                            field[i - 1][j] = 'D';
                        }

                    } catch (ArrayIndexOutOfBoundsException e) {

                    }
                    try {
                        if (field[i + 1][j] == 'S') {
                            noAnswer = true;
                            break;
                        } else if (field[i + 1][j] == 'W') {

                        } else {
                            field[i + 1][j] = 'D';
                        }
                    } catch (ArrayIndexOutOfBoundsException e) {

                    }
                    try {
                        if (field[i][j - 1] == 'S') {
                            noAnswer = true;
                            break;
                        } else if (field[i][j - 1] == 'W') {

                        } else {
                            field[i][j - 1] = 'D';
                        }
                    } catch (ArrayIndexOutOfBoundsException e) {

                    }

                    try {
                        if (field[i][j + 1] == 'S') {
                            noAnswer = true;
                            break;
                        } else if (field[i][j + 1] == 'W') {

                        } else {
                            field[i][j + 1] = 'D';
                        }
                    } catch (ArrayIndexOutOfBoundsException e) {

                    }


                }
            }
            if (noAnswer) {
                break;
            }
        }

        if (noAnswer) {
            sb.append(0);
        } else {
            sb.append("1\n");
            for (int i = 0; i < COLS; i++) {
                for (int j = 0; j < ROWS; j++) {
                    sb.append(field[i][j]);
                }
                sb.append("\n");
            }
        }

        sb.append("\n");

        bw.write(sb.toString());

        bw.flush();
        br.close();
        bw.close();

    }


}

0개의 댓글

관련 채용 정보