반응형

문제 출처 :


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



알고리즘 분석 :


문제 해결에 필요한 사항

1. 구현


구현을 요구하는 문제이다.


vcR~vcY는 각각 현재 컬러들의 위치를 저장해주는 역할이고 그 아래에서 bfs를 통해 각 컬러의 위치마다 4개이상 터지는지 확인하고 있다.


그 후 재정렬을 하게 되는데 이 부분에서 조금 더 최적화 할 수 있지만 충분히 통과할 수 있기에


위에서부터 아래로보며 밑으로 한칸씩 내릴 수 있다면 계속해서 내려주는 방식을 이용하였다.






소스 코드 : 


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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
#include <iostream>
#include <cstdio>
#include <queue>
#include <memory.h>
#include <vector>
 
using namespace std;
 
typedef pair<intint> pii;
 
char arr[13][7];
bool visit[13][7];
 
int dy[4= { -1,0,1,};
int dx[4= { 0,-1,0,};
 
vector<pii> getColor(char color)
{
    vector<pii> vc;
    for (int i = 0; i < 12; i++)
        for (int j = 0; j < 6; j++)
            if (arr[i][j] == color)
                vc.push_back({ i,j });
 
    return vc;
}
 
bool bfs(char color, vector<pii> vc)
{
    queue<pii> q;
    bool chk = false;
 
    for (int i = 0; i < vc.size(); i++)
    {
        int y = vc[i].first;
        int x = vc[i].second;
 
        q.push({ y,x });
        int cnt = 0;
        memset(visit, 0sizeof(visit));
 
        while (!q.empty())
        {
            int hy = q.front().first;
            int hx = q.front().second;
            
            q.pop();
 
            if (visit[hy][hx])
                continue;
 
            visit[hy][hx] = true;
            cnt++;
            for (int j = 0; j < 4; j++)
            {
                int ny = hy + dy[j];
                int nx = hx + dx[j];
 
                if ((<= ny && ny < 12 && (<= nx && nx < 12)) && arr[ny][nx] == color)
                    q.push({ ny,nx });
            }
 
        }
 
        if (cnt >= 4)
        {
            for (int i = 0; i < 12; i++)
                for (int j = 0; j < 6; j++)
                    if (visit[i][j])
                    {
                        arr[i][j] = '.';
                        chk = true;
                    }
        }
    }
 
    if (chk)
        return true;
    else
        return false;
}
 
int main()
{
    for (int i = 0; i < 12; i++)
        scanf("%s", arr[i]);
 
    int combo = 0;
 
    while (1)
    {
        bool isEvent = false;
 
        vector<pii> vcR = getColor('R');
        vector<pii> vcG = getColor('G');
        vector<pii> vcB = getColor('B');
        vector<pii> vcP = getColor('P');
        vector<pii> vcY = getColor('Y');
 
        bool r = bfs('R', vcR);
        bool g = bfs('G', vcG);
        bool b = bfs('B', vcB);
        bool p = bfs('P', vcP);
        bool y = bfs('Y', vcY);
 
        if (r || g || b || p || y)
            isEvent = true;
 
        if (isEvent)
            combo++;
        else
            break;
 
        // 재정렬
        for(int t = 0; t < 12; t++)
            for (int i = 0; i < 12; i++)
            {
                for (int j = 0; j < 6; j++)
                {
                    if (arr[i][j] != '.' && arr[i + 1][j] == '.')
                    {
                        arr[i + 1][j] = arr[i][j];
                        arr[i][j] = '.';
                    }
                }
            }
    }
 
    cout << combo << endl;
 
    return 0;
}
 
//                                                       This source code Copyright belongs to Crocus
//                                                        If you want to see more? click here >>
Crocus


반응형

'Applied > 알고리즘 문제풀이' 카테고리의 다른 글

[5670번] 휴대폰 자판  (0) 2018.01.26
[13458번] 시험 감독  (2) 2018.01.26
[4963번] 섬의 개수  (0) 2018.01.24
[2667번] 단지번호붙이기  (0) 2018.01.24
[12913번] 매직 포션  (0) 2018.01.23