코딩공작소
[백준]PuyoPuyo 본문
https://www.acmicpc.net/problem/11559
11559번: Puyo Puyo
현재 주어진 상황에서 몇연쇄가 되는지 출력하라. (하나도 터지지 않는다면 0을 출력하면 된다.)
www.acmicpc.net
flag를 사용하는 문제의 경우 dfs보다 bfs가 적합한것 같다. dfs의 경우는 재귀구조로 계속 flag정보가 변한다. 최종 원하는 함수를 실행하고 바로 종료해주기가 까다롭다. --> 종료시점의 부분에서 항상 주의해야 한다!!!!
또한, flag를 설정할 때 else false를 해주면 이미 true를 발견했지만 다시 false로 정보가 갱신되는 문제에 주의해야한다.
즉, true가 한번이라도 있으면 true로 바꾸고 나머지 경우에 대해서는 false로 갱신을 하면 안된다는 것.
큐나 벡터를 통해 원소들의 값을 쭈루룩 옮기는 것도 편리한것 같다.
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
|
#include <iostream>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;
struct INFO {
int r, c;
};
bool flag = false;
char map[12][6];
bool isV[12][6];
queue<INFO> q, q_block;
vector<char> v;
int dr[] = { 0,0,-1,1 }, dc[] = { 1,-1,0,0 };
void bfs(int r, int c, char val) {
isV[r][c] = true;
q.push({ r,c });
q_block.push({ r,c });
while (!q.empty()) {
int rr = q.front().r, cc = q.front().c; q.pop();
for (int i = 0; i < 4; i++) {
int nr = rr + dr[i], nc = cc + dc[i];
if (nr < 0 || nc < 0 || nr >= 12 || nc >= 6) continue;
if (!isV[nr][nc] && map[nr][nc] == val) {
isV[nr][nc] = true;
q.push({ nr,nc });
q_block.push({ nr,nc });
}
}
}
if (q_block.size() >= 4) {
flag = true;
while (!q_block.empty()) {
int nr = q_block.front().r, nc = q_block.front().c; q_block.pop();
map[nr][nc] = '.';
}
}
else { //여기서 flag=false를 하는 실수를 했었음.
while (!q_block.empty()) q_block.pop();
}
}
void fall() {
for (int c = 0; c < 6; c++) {
for (int r = 0; r < 12; r++) {
if (map[r][c] != '.') {
v.push_back(map[r][c]);
map[r][c] = '.';
}
}
for (int r = 0; r < v.size(); r++) {
map[r][c] = v[r];
}
v.clear();
}
}
void solve() {
int cnt = 0;
while (1) {
flag = false;
memset(isV, false, sizeof(isV));
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 6; j++) {
if (!isV[i][j] && map[i][j] != '.') {
bfs(i, j, map[i][j]);
}
}
}
if (flag) cnt++;
else break;
fall();
}
printf("%d\n", cnt);
}
int main()
{
for (int i = 11; i >= 0; i--) {
for (int j = 0; j < 6; j++) {
cin >> map[i][j];
}
}
solve();
return 0;
}
|
cs |
참고 :
BOJ 11559 · Puyo Puyo
알고리즘 분류 : BFS, 시뮬레이션 게임 '뿌요 뿌요'를 프로그래밍하는 문제다. 주어진 뿌요뿌요 판에서 얼마나 많은 연쇄가 일어나는지 맞춰야 한다. BFS를 통해 전체 탐색을 하고, 터트릴 수 있는 블록이 있는지..
rebas.kr
이 분의 코드가 진행과정이 깔끔하게 되어있는 것같다... (flag나 전개과정)
'알고리즘 > 그래프' 카테고리의 다른 글
[백준]다리만들기2 (0) | 2019.09.20 |
---|---|
[백준]두동전 (0) | 2019.09.17 |
[백준]섬의개수 (0) | 2019.09.14 |
[백준]다리만들기 (0) | 2019.09.14 |
[백준]단지번호붙이기 (0) | 2019.09.14 |