말랑한 하루

[BAEKJOON] 11559 Pyuo Pyuo (C++) 본문

문제풀이/BAEKJOON Online Judge

[BAEKJOON] 11559 Pyuo Pyuo (C++)

지수는말랑이 2019. 11. 13. 21:21
반응형

[문제]

상하좌우로 연결된 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;
}
반응형
Comments