Algorithm/baekjoon

두 동전

마닐라 2022. 2. 23. 23:10

📍 문제 설명

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

 

16197번: 두 동전

N×M 크기의 보드와 4개의 버튼으로 이루어진 게임이 있다. 보드는 1×1크기의 정사각형 칸으로 나누어져 있고, 각각의 칸은 비어있거나, 벽이다. 두 개의 빈 칸에는 동전이 하나씩 놓여져 있고,

www.acmicpc.net

 

💡 접근

구슬 탈출이랑 비슷한 문제였는데, 버튼을 10번 이상이 아니라 10번 보다 많이 누르면 -1를 출력해야한다....

각 동전은 동시에 움직이지만 한 동전이 움직일 수 없는 경우 제자리에 있고 다른 동전은 움직일 수 있으면 움직여야한다.

 

 

👩‍💻 코드

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

public class Main {
    static int s, n, m , v, e, k, r, x = 21, y = 21, answer, cnt, add, sub, mul, div, max = Integer.MIN_VALUE, min = Integer.MAX_VALUE;
    static int[] arr, dice;
    static long[] dp;
    static char[][] board;
    static boolean[][][][] visited;
    static int[] dx = {1,0,-1,0};
    static int[] dy = {0,-1,0,1};
    static ArrayList<Integer> list;
    static StringBuilder sb;
    static Queue<Point> q;
    public static void main(String[] args) throws IOException {
        Main T = new Main();
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

        StringTokenizer st = new StringTokenizer(br.readLine());
        n = Integer.parseInt(st.nextToken());
        m = Integer.parseInt(st.nextToken());

        board = new char[n][m];
        visited = new boolean[n][m][n][m];
        q = new LinkedList<>();

        for(int i = 0; i < n; i++) {
            String str = br.readLine();
            for(int j = 0; j < m; j++) {
                board[i][j] = str.charAt(j);
                if(board[i][j] == 'o' && x != 21 && y != 21) {
                    q.offer(new Point(x, y, i, j));
                    visited[x][y][i][j] = true;
                }
                if(board[i][j] == 'o') {
                    x = i;
                    y = j;
                }
            }
        }

        T.solution();
    }

    private void solution() {
        cnt = 1;
        while(!q.isEmpty()) {
            int len = q.size();
            for (int c = 0; c < len; c++) {
                if (cnt > 10) {
                    System.out.println(-1);
                    System.exit(0);
                }
                Point cp = q.poll();
                for (int i = 0; i < 4; i++) {
                    int nx1 = cp.x1 + dx[i];
                    int ny1 = cp.y1 + dy[i];
                    int nx2 = cp.x2 + dx[i];
                    int ny2 = cp.y2 + dy[i];

                    //동전이 둘 다 떨어지는 경우 n = 1 m = 2 1,0 1,1
                    if ((nx1 < 0 || nx1 >= n || ny1 < 0 || ny1 >= m) && (nx2 < 0 || nx2 >= n || ny2 < 0 || ny2 >= m)) continue;
                    //동전이 둘 중 하나 떨어지는 경우
                    else if ((nx1 < 0 || nx1 >= n || ny1 < 0 || ny1 >= m) || (nx2 < 0 || nx2 >= n || ny2 < 0 || ny2 >= m)) {
                        System.out.println(cnt);
                        System.exit(0);
                    }
                    //벽이면 해당 동전은 움직일 수 없다.
                    if (board[nx1][ny1] == '#') {
                        nx1 = cp.x1;
                        ny1 = cp.y1;
                    }
                    if (board[nx2][ny2] == '#') {
                        nx2 = cp.x2;
                        ny2 = cp.y2;
                    }

                    if (!visited[nx1][ny1][nx2][ny2]) {
                        visited[nx1][ny1][nx2][ny2] = true;
                        q.offer(new Point(nx1, ny1, nx2, ny2));
                    }
                }
            }
            cnt++;
        }
        System.out.println(-1);
    }

    private static class Point {
        private int x1;
        private int y1;
        private int x2;
        private int y2;

        public Point(int x1, int y1, int x2, int y2) {
            this.x1 = x1;
            this.y1 = y1;
            this.x2 = x2;
            this.y2 = y2;
        }

        @Override
        public String toString() {
            return "Point{" +
                    "x1=" + x1 +
                    ", y1=" + y1 +
                    ", x2=" + x2 +
                    ", y2=" + y2 +
                    '}';
        }
    }
}

'Algorithm > baekjoon' 카테고리의 다른 글

N-Queen  (0) 2022.02.27
에너지 모으기  (0) 2022.02.24
컨베이어 벨트 위의 로봇  (0) 2022.02.23
드래곤커브  (0) 2022.02.21
주사위 굴리기  (0) 2022.02.21