문제설명
1. 주어진 뿌요뿌요 룰에따라 몇콤보가 나오는지 출력하면됨 .
알고리즘
1. 뿌요를 밑으로 내려주는 함수 down() 설계
2. 뿌요가 4개이상붙어있는지 확인하는 dfs_size함수 설계
- dfs 를 이용하여 같은 문자일때만 재귀 호출 하였고 마지막에 깊이를 return 하였다.
3. 뿌요가 4개이상일때 터트리는 함수 설계.
- dfs_size 함수를 이용하여 뿌요의갯수가 4개이상임을 확인하였을때 뿌요를 터트렸다
- 그리고 뿌요가 터지면 while 문을 한번더 돌게 하는 논리형 변수를 수정하였다.
코드
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
|
#include<iostream>
using namespace std;
char map[13][7];
int visited[13][7];
int dy[] = { 0,0,1,-1 };
int dx[] = { 1,-1,0,0 };
void down() { // 밑으로 내려주는 함수
for (int i = 11; i > 0; i--) {
for (int j = 0; j < 6; j++) {
if (map[i][j] == '.') {
if (map[i - 1][j] != '.') {
map[i][j] = map[i - 1][j];
map[i - 1][j] = '.';
}
else if (i-2>=0&&map[i - 2][j] != '.') {
map[i][j] = map[i - 2][j];
map[i - 2][j] = '.';
}
else if (i - 3 >= 0 && map[i - 3][j] != '.') {
map[i][j] = map[i - 3][j];
map[i - 3][j] = '.';
}
else if (i - 4 >= 0 && map[i - 4][j] != '.') {
map[i][j] = map[i - 4][j];
map[i - 4][j] = '.';
}
}
}
}
}
bool pos = false;
int pos_cnt = 0;
void dfs_size(int y, int x, char C) {
if (visited[y][x]) {
return;
}
visited[y][x] = 1;
for (int i = 0; i < 4; i++) {
int next_x = x + dx[i];
int next_y = y + dy[i];
if (next_x >= 0 && next_x < 6 && next_y >= 0 && next_y < 12) {
if (!visited[next_y][next_x] && map[next_y][next_x] == C) {
dfs_size(next_y, next_x, C);
pos_cnt++;
}
}
}
}
void dfs(int y, int x, char C) {
if (visited[y][x]) {
return;
}
visited[y][x] = 1;
map[y][x] = '.';
for (int i = 0; i < 4; i++) {
int next_x = x + dx[i];
int next_y = y + dy[i];
if (next_x >= 0 && next_x < 6 && next_y >= 0 && next_y < 12) {
if (!visited[next_y][next_x] && map[next_y][next_x] == C) {
map[next_y][next_x] = '.';
dfs(next_y, next_x, C);
}
}
}
}
void reset() {
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 6; j++) {
visited[i][j] = 0;
}
}
}
int main() {
cin.tie(NULL);
ios::sync_with_stdio(false);
int ans = 0;
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 6; j++) {
cin >> map[i][j];
}
}
bool next = false;
while (1) {
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 6; j++) {
if (map[i][j] != '.') {
//뿌요가 몇개씩 붙어있는지
dfs_size(i, j, map[i][j]);
reset();
//뿌요가 터질수있으면 터트리기.
if (pos_cnt>=3) {
dfs(i, j, map[i][j]);
next = true;
}
pos_cnt = 0;
}
}
}
//뿌요 밑으로 내리기 !
down();
//뿌요가 터지지않으면 break
if (!next)break;
//방문 초기화
reset();
//next 초기화
next = false;
//콤보 ++
ans++;
}
cout << ans;
}
|
cs |
'c++ > 백준' 카테고리의 다른 글
백준 1152번 : 단어의 개수 (0) | 2020.04.29 |
---|---|
백준 11403번: 경로 찾기 (0) | 2020.04.29 |
백준 1010번 : 다리 놓기 (0) | 2020.04.26 |
백준 1520번: 내리막길 (0) | 2020.04.26 |
백준 2146번 : 다리 만들기 (0) | 2020.04.26 |