말랑한 하루
[BAEKJOON] 11559 Pyuo Pyuo (C++) 본문
반응형
[문제]
상하좌우로 연결된 5개의색 R, G, B, P, Y들이 같은색끼리 4개이상 연결되어있다면 사라지게된다.
뿌여는 터지고난후 중력의영향을받아 아래로떨어지고, 위를 반복하게된다.
총 몇번의 연쇄가 일어나는지 구하시오!
[조건]
1. 같은색이 4개이상모인 모든색들이 동시에 터지게된다.
2. 터지고난후 남아있는 뿌요들은 바닥을 향해 떨어지고, 빈공간이 없이 쌓이게된다.
[해결순서]
전체적으로 BFS를 돌려 같은색이 4개이상인곳은 Check해주고, 경우가 존재할경우 Flag를 통해
뿌요를 내릴 수 있다. 존재하지않을경우 프로그램은 그대로 종료 시키면된다.
뿌요를 내릴때 딱히 방법이생각나지않아 Stack을 사용했다.
맵 전체를 세로기준으로 순차적으로 Stack에 뿌요가 존재할경우 뿌요의 색을 저장해주고
바닥부터 Stack의 내용물을 다시 삽입하고, 나머지는 .으로 초기화 시켜서 해결했슴니다.
[부분소스코드]
void setpuyo(bool temp[12][6]) {
for (int i = 0; i < 12; i++) {
for (int j = 0; j < 6; j++) {
if (temp[i][j]) {
puyo[i][j] = '.';
}
}
}
for (int i = 0; i < 6; i++) {
stack <char> s;
for (int k = 0; k < 12; k++) {
if (puyo[k][i] != '.')
s.push(puyo[k][i]);
}
int y = 11, x = i;
int size = s.size();
for (int k = 11; k > 11 - size; k--) {
char out = s.top(); s.pop();
puyo[k][i] = out;
}
for (int k = 11 - size; k >= 0; k--)
puyo[k][i] = '.';
}
spectrum++;
find();
}
[전체소스코드]
#ifdef _DEBUG
#include "bits_stdc++.h"
#else
#include "bits/stdc++.h"
#endif
#pragma warning(disable:4996)
using namespace std;
char puyo[12][6];
bool check[12][6];
int yY[] = { -1,1,0,0 };
int xX[] = { 0,0,-1,1 };
char cC[] = { 'R', 'G', 'P', 'Y' };
//'R' = 82 ,'G' = 71 ,'P' = 80, 'Y' = 89
int spectrum;
typedef struct data {
int y;
int x;
int c;
}Data;
bool range(int y, int x) {
if (y < 0 || x < 0 || y>11 || x>5 )
return false;
else
return true;
}
void find();
void setpuyo(bool temp[12][6]) {
for (int i = 0; i < 12; i++)
for (int j = 0; j < 6; j++)
if (temp[i][j])
puyo[i][j] = '.';
for (int i = 0; i < 6; i++) {
stack <char> s;
for (int k = 0; k < 12; k++)
if (puyo[k][i] != '.')
s.push(puyo[k][i]);
int y = 11, x = i;
int size = s.size();
for (int k = 11; k > 11 - size; k--) {
char out = s.top(); s.pop();
puyo[k][i] = out;
}
for (int k = 11 - size; k >= 0; k--)
puyo[k][i] = '.';
}
spectrum++;
find();
}
void solve(vector <pair<int, int> > &v) {
memset(check, 0, sizeof check);
bool flag = false;
bool temp[12][6] = { 0, };
queue <Data> q;
for (int k = 0; k < v.size(); k++) {
int vy = v[k].first;
int vx = v[k].second;
int vc = puyo[vy][vx];
if (!check[vy][vx]) {
check[vy][vx] = true;
q.push({ vy, vx, vc });
vector <pair<int, int> > p;
p.push_back({ vy, vx });
while (!q.empty()) {
Data out = q.front(); q.pop();
for (int i = 0; i < 4; i++) {
int ny = out.y + yY[i];
int nx = out.x + xX[i];
int nc = puyo[ny][nx];
if (range(ny, nx) && !check[ny][nx] && out.c==nc) {
check[ny][nx] = true;
q.push({ ny, nx, nc });
p.push_back({ ny, nx });
}
}
}
if (p.size() >= 4) {
flag = true;
for (int i = 0; i < p.size(); i++)
temp[p[i].first][p[i].second] = true;
}
}
}
if(flag) setpuyo(temp);
}
void find() {
vector <pair<int, int> > v;
for(int i=0;i<12;i++)
for (int j = 0; j < 6; j++)
if (puyo[i][j] != '.')
v.push_back({ i,j });
solve(v);
}
int main() {
#ifdef _CONSOLE
freopen("input.txt", "r", stdin);
#endif
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
for (int i = 0; i < 12; i++)
cin >> puyo[i];
find();
cout << spectrum;
}
반응형
'문제풀이 > BAEKJOON Online Judge' 카테고리의 다른 글
[BAEKJOON] 16928 뱀과 사다리 게임 (C++, Java) (0) | 2020.12.10 |
---|---|
[BAEKJOON] 9663 N-Queen (C++) (0) | 2020.02.05 |
[BAEKJOON] 11003 최솟값 찾기 (C++) (0) | 2020.02.04 |
[BAEKJOON] 4963 섬의개수 (C++) (0) | 2019.11.18 |
[BAEKJOON] 2933 미네랄 (C++) (0) | 2019.11.13 |
Comments