미네랄에서 고통받다 보니 이런류는 어느정도 익숙해졌다.


떨어질 때 빈공간을 무조건 메꾼다는 조건이 있으면 참 편하다. 반대로 형태를 유지해야 하면 좀 귀찮다.


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
#include <stdio.h>
 
char a[12][8];
int xq[100], yq[100], qi, c[12][6], ans, f = 1;
int dx[] = { 0,0,1,-1 }, dy[] = { 1,-1,0,0 };
 
void dfs(int x, int y) {
    c[x][y] = ans;
    xq[qi] = x; yq[qi++= y;
    for (int i = 0; i < 4; i++) {
        int nx = x + dx[i], ny = y + dy[i];
        if (nx < 0 || ny < 0 || nx>12 || ny>5 || a[nx][ny] != a[x][y] || c[nx][ny] == ans) continue;
        dfs(nx, ny);
    }
}
 
void del() {
    f = 1;
    for (int i = 0; i < qi; i++) {
        a[xq[i]][yq[i]] = '.';
    }
}
 
void search() {
    for (int i = 0; i < 12; i++for (int j = 0; j < 6; j++) {
        if (a[i][j] != '.') {
            qi = 0;
            dfs(i, j);
            if (qi >= 4) del();
        }
    }
}
 
void drop() {
    for (int i = 0; i < 6; i++) {
        int pad = a[11][i] == '.' ? 1 : 0;
        for (int j = 10; j >= 0; j--) {
            if (a[j][i] == '.') pad++;
            else {
                char temp = a[j][i];
                a[j][i] = a[j + pad][i];
                a[j + pad][i] = temp;
            }
        }
    }
}
 
 
int main() {
    for (int i = 0; i < 12; i++scanf(" %s"&a[i]);
    while (f) {
        f = 0;
        ans++;
        search();
        drop();
    }
    printf("%d", ans - 1);
    return 0;
}
cs


'BOJ' 카테고리의 다른 글

5052 전화번호 목록  (0) 2018.02.18
1072 게임  (0) 2018.02.18
4963 섬의 개수  (0) 2018.02.18
11812 K진 트리  (0) 2018.02.18
1761 정점들의 거리  (0) 2018.02.17

+ Recent posts