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
Archives
Today
Total
관리 메뉴

최's 먹공로그

BOJ11559_Puyo Puyo 본문

APS

BOJ11559_Puyo Puyo

ChoiSH313 2019. 9. 5. 15:11

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


문제정리

1. 룰

(1) 뿌요는 아래에 바닥이나 다른 뿌요가 나올 때까지 아래로 떨어진다.

(2) 뿌요를 놓고 난 후, 같은 색 뿌요가 4개 이상 상하좌우로 연결되어 있으면 연결된 같은 색

뿌요들이 한꺼번에 없어진다.

(3) 뿌요들이 없어지고 나서 위에 다른 뿌요들이 있다면, 아래로 떨어지게 된다.

(4) 아래로 떨어지고 나서 다시 같은 색의 뿌요들이 4개 이상 모이게 되면 또 터지게 되는데

터진 후 뿌요들이 내려오고 다시 터짐을 반복할 때마다 1연쇄씩 늘어난다.

(5) 터질 수 있는 뿌요가 여러 그룹이 있다면 동시에 터져야 하고 여러 그룹이 터지더라도 한

번의 연쇄가 추가된다.

2. 필드가 주어졌을 때, 연쇄가 몇 번 연속으로 일어날지 계산

3. map[12][6]이 주어진다. '.'은 빈공간 , R은 빨강 뿌요 , G는 초록 뿌요 , B는 파랑 뿌요 , P는 보라 뿌요

Y는 노랑 뿌요(대문자로 주어진다)

4. 입력으로 주어지는 필드는 뿌요들이 전부 아래로 떨어진 뒤의 상태이다.

5. 현재 주어진 상황에서 몇 연쇄가 되는지 출력하라. 하나도 터지지 않는다면 0을 출력


문제issue

1. 뿌요는 동시에 터진다.


해결흐름

1. 뿌요 없애기

(1) map에서 빈공간이 아니고 , 방문하지 않은 뿌요라면 거기에서 부터 bfs시작해서 연결된

같은 뿌요가 있으면 카운트

(2) 카운트가 4개 이상이면 다시 bfs돌아서 그 위치들을 q에 넣어줌 , 이때 flag = ture

(3) q에 있는 뿌요 위치들 빈공간으로 바꿔줌

2. 뿌요 내리기

(1) 각 열을 기준으로 아래에서 부터 뿌요가 있으면 q에 담기

(2) 맨 아래에서 부터 채워주기

(3) q 크기 이상의 값은 빈공간으로 바꿔주기

3. 연쇄카운트

4. 종료조건

flag = false면 더 이상 없앨 뿌요가 존재x


소스코드

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Arrays;
import java.util.LinkedList;
import java.util.Queue;
 
public class Main {
 
    private static boolean flag;
    private static char[][] map;
    private static boolean[][] visited;
 
    public static void main(String[] args) throws Exception {
        // input
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        map = new char[12][6];
        visited = new boolean[12][6];
        for (int i = 0; i < 12; i++) {
            String s = br.readLine().trim();
            for (int j = 0; j < 6; j++) {
                map[i][j] = s.charAt(j);
            }
        }
        int result = 0;
        while (true) {
            // 뿌요없애기
            flag = false;
            remove();
            if (flag)
                result++;
            else
                break;
            // 뿌요내리기
            down();
        }
        System.out.println(result);
    } // end of main
 
    private static void down() {
        for (int i = 0; i < 6; i++) {
            Queue<Character> q = new LinkedList<Character>();
            for (int j = 11; j >= 0; j--) {
                if(map[j][i] != '.') {
                    q.add(map[j][i]);
                }
            }
            int q_size = q.size();
            for (int j = 11; j > 11 - q_size; j--) {
                map[j][i] = q.poll();
            }
            if(q_size < 12 && q_size > 0) {
                for (int j = 11 - q_size; j >= 0; j--) {
                    map[j][i] = '.';
                }
            }
        }
    }
 
    static class pair {
        int r;
        int c;
 
        public pair(int r, int c) {
            super();
            this.r = r;
            this.c = c;
        }
    }
 
    private static int[] dr = { -1010 };
    private static int[] dc = { 010-1 };
 
    private static void remove() {
        visited = new boolean[12][6];
        for (int i = 0; i < 12; i++) {
            for (int j = 0; j < 6; j++) {
                if (map[i][j] != '.' && !visited[i][j]) {
                    Queue<pair> q = new LinkedList<pair>();
                    Queue<pair> remove_puyo = new LinkedList<pair>();
                    int cnt = 0;
                    visited[i][j] = true;
                    q.add(new pair(i, j));
                    remove_puyo.add(new pair(i, j));
                    while (!q.isEmpty()) {
                        cnt++;
                        pair p = q.poll();
                        int r = p.r;
                        int c = p.c;
                        for (int k = 0; k < 4; k++) {
                            int nr = r + dr[k];
                            int nc = c + dc[k];
                            if (nr >= 0 && nr < 12 && nc >= 0 && nc < 6 && map[nr][nc] == map[r][c]
                                    && !visited[nr][nc]) {
                                q.add(new pair(nr, nc));
                                remove_puyo.add(new pair(nr, nc));
                                visited[nr][nc] = true;
                            }
                        }
                    }
                    // cnt >= 4면 그 위치 빈공간으로 만들기
                    if (cnt >= 4) {
                        flag = true;
                        while(!remove_puyo.isEmpty()) {
                            pair p = remove_puyo.poll();
                            map[p.r][p.c] = '.'
                        }
                    }
                }
            }
        }
    }
// end of class
cs


'APS' 카테고리의 다른 글

BOJ1018 체스판 다시 칠하기  (0) 2022.05.22
BOJ11559_Puyo Puyo C++  (0) 2021.05.23
BOJ17136_색종이 붙이기  (0) 2019.09.03
SWEA1767_[SW Test 샘플문제] 프로세서 연결하기  (2) 2019.09.03
BOJ17140_이차원배열과 연산  (0) 2019.09.01