본문 바로가기
백준

[백준 11559] Puyo Puyo, C++

by 황인태(intaehwang) 2020. 2. 25.
반응형

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

 

11559번: Puyo Puyo

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

www.acmicpc.net

 본 문제는 2015 연세대학교 프로그래밍 경시대회 C번 문제다. 뿌요뿌요를 구현하는 문제다. 어렸을 때 많이했던 게임인데 문제로 만나니 참 반갑다. (못 풀었으면 안반가웠을 듯ㅎㅎ) 12 x 6 크기에 ' . '는 빈 공간이고 알파벳 대문자는 뿌요를 나타낸다. 

문제 해결 과정은 다음과 같다.

  1. 인접한 4개의 뿌요가 같은 색이면 터진다.
  2. 터진 뿌요 위에 다른 뿌요가 있으면 밑으로 내려온다.
  3. 뿌요가 안터지면 프로그램을 끝낸다.

처음에 문제를 풀면서 뿌요가 터지고 바로 위에있는 뿌요를 밑으로 내렸다. 그러면 예제 TC는 맞지만 정답은 아니다. 즉, 전체를 탐색하면서 터질 뿌요를 정하고 한번에 터트려야 한다.

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
#include <iostream>
#include <queue>
#include <string>
#include <cstring>
#include <tuple>
 
using namespace std;
 
char map[13][7];
bool chk[13][7];
int dx[] = {1-100};
int dy[] = {001-1};
 
int main() {
    string s;
    for (int i = 0; i < 12; i++) {
        cin >> s;
        for (int j = 0; j < 6; j++) {
            map[i][j] = s[j];
        }
    }
    queue<tuple<charintint>> q;
    int ans = 0;
    vector<pair<intint>> b;
    while (true) {
        bool flag = false;
        for (int i = 0; i < 12; i++) {
            for (int j = 0; j < 6; j++) {
                if (map[i][j] == '.'continue;
                
                memset(chk, falsesizeof(chk));
                
                chk[i][j] = true;
                q.push(make_tuple(map[i][j], i, j));
 
                vector<pair<intint>> v;
                v.push_back(make_pair(i, j));
 
                int cnt = 1;
                while (!q.empty()) {
                    char c;
                    int x, y;
                    tie(c, x, y) = q.front();
                    q.pop();
                    for (int k = 0; k < 4; k++) {
                        int nx = x + dx[k];
                        int ny = y + dy[k];
                        if (nx >= 0 && nx < 12 && ny >= 0 && ny < 6) {
                            if (!chk[nx][ny] && map[nx][ny] == c) {
                                chk[nx][ny] = true;
                                q.push(make_tuple(c, nx, ny));
                                v.push_back(make_pair(nx, ny));
                                cnt += 1;
                            }
                        }
                    }
                }
                if (cnt >= 4) {
                    for (int k = 0; k < v.size(); k++) {
                        int x = v[k].first;
                        int y = v[k].second;
                        b.push_back(make_pair(x, y));
                    }
                }
            }
        }
        if (b.size() != 0) {
            flag = true;
            ans += 1;
            for (int k = 0; k < b.size(); k++) {
                map[b[k].first][b[k].second] = '.';
            }
            b.clear();
            for (int v = 0; v < 11; v++) {
                for (int u = 0; u < 6; u++) {
                    if (map[v][u] == '.'continue;
                    if (map[v+1][u] == '.') {
                        int index = 0;
                        while (v-index >= 0 && map[v-index][u] != '.') {
                            map[v-index + 1][u] = map[v-index][u];
                            index += 1;
                        }
                        map[v-index+1][u] = '.';
                    }
                }
            }
        }
        if (!flag) break;
    }
    printf("%d\n", ans);
}
cs
반응형

'백준' 카테고리의 다른 글

[백준 15684] 사다리 조작, C++  (0) 2020.03.02
[백준 1963] 소수 경로  (0) 2020.02.26
[백준 2573] 빙산, C++  (0) 2020.02.25
[백준 10868] 최솟값, C++  (0) 2020.02.21
[백준 11404] 플로이드, C++  (0) 2020.02.21
Buy me a coffeeBuy me a coffee

댓글