PS

BOJ 11559 - Puyo Puyo

728x90

www.acmicpc.net/problem/11559

 

11559번: Puyo Puyo

현재 주어진 상황에서 몇연쇄가 되는지 출력하라. (하나도 터지지 않는다면 0을 출력하면 된다.)

www.acmicpc.net

 

BFS, DFS 둘 중 하나를 선택해서 4개 이상 나오는 뿌요를 제거하고 

제거된 뿌요 위에 올라가 있는 뿌요가 하나 이상 있으면 그 뿌요들을 바닥으로 내리는 작업을 수반해야하는 문제다.

BFS 를 통해서 4개 이상 나오는 뿌요와 이를 제거하고 바닥으로 내리는 것 까지는 했으나,

동시에, 4개 이상 존재하는 뿌요의 집단군이 여러개 있을때, 이를 모두 제거하고 카운팅 했어야했는데

이를 못해서 통과를 못하고 있었다 (동시에 처리를 못하면 18% 정도에서 틀렸습니다 나옴)

 

아래 내용을 보고 겨우 해답을 이해할 수 있었다

pangtrue.tistory.com/117

 

[백준 11559 : C++] Puyo Puyo / BFS, DFS

문제 풀이 ( 문제를 이해하는데 30분 정도 걸렸고, 푸는데 2시간 정도 걸렸다. ) BFS로 풀었고 알고리즘은 아래처럼 적용했다. BFS를 통해 맵의 각 영역을 별도의 맵에 저장한다. (같은 색이라도 다

pangtrue.tistory.com

 

 

- C++

 

#include <bits/stdc++.h>
 
#define endl "\n"
 
using namespace std;
 
int answer;
int dy[4= {-1100};
int dx[4= {00-11};
char adj[12][6];                // 인접행렬
bool visited[12][6];            // 방문여부 행렬
int labelingAdj[12][6];         // 동일한 색상의 뿌요에는 동일한 label 번호가 붙는다.
int labelingCount[12 * 6 + 1];  // label 번호가 몇개 들어있는지 파악하고, 4개 이상 있으면 지워야할게 있는것.
 
void resetPuyo() {
    for (int c = 0; c < 6++c) {
        int row_top = 11;
        for (int r = 11; r >= 0--r) {
            if (adj[r][c] == '.'continue;
            if (row_top != r) {
                adj[row_top][c] = adj[r][c];
                adj[r][c] = '.';
            }
            --row_top;
        }
    }
}
 
void removePuyo(int label) {
    for (int i = 1; i <= label; ++i) {
        if (labelingCount[i] >= 4) {
            for (int y = 0; y < 12++y) {
                for (int x = 0; x < 6++x) {
                    if (labelingAdj[y][x] == i)
                        adj[y][x] = '.';
                }
            }
        }
    }
}
 
void bfs(int r, int c, int label) {
    char color = adj[r][c];
    queue<pair<intint>> q;
    q.push(make_pair(r, c));
    visited[r][c] = true;
    labelingAdj[r][c] = label;
    labelingCount[label]++;
 
    while (!q.empty()) {
        int y = q.front().first;
        int x = q.front().second;
        q.pop();
 
        for (int i = 0; i < 4++i) {
            int ny = y + dy[i];
            int nx = x + dx[i];
 
            if (ny < 0 || ny >= 12 || nx < 0 || nx >= 6continue;
            if (!visited[ny][nx] && adj[ny][nx] == color) {
                q.push(make_pair(ny, nx));
                visited[ny][nx] = true;
                labelingAdj[ny][nx] = label;
                labelingCount[label]++;
            }
        }
    }
}
 
bool canDeletePuyo(int label) {
    for (int i = 1; i <= label; ++i)
        if (labelingCount[i] >= 4return true;
 
    return false;
}
 
int solve() {
    int label = 1;
    for (int i = 0; i < 12++i) {
        for (int j = 0; j < 6++j) {
            if (!visited[i][j] && adj[i][j] != '.') {
                bfs(i, j, label++);
            }
        }
    }
    return label;
}
 
int main() {
    cin.tie(0);
    ios_base::sync_with_stdio(0);
 
    for (int i = 0; i < 12++i)
        for (int j = 0; j < 6++j)
            cin >> adj[i][j];
 
    while (1) {
        memset(visited, falsesizeof(visited));
        memset(labelingAdj, 0sizeof(labelingAdj));
        memset(labelingCount, 0sizeof(labelingCount));
 
        int label = solve();
 
        if (!canDeletePuyo(label)) break;
 
        removePuyo(label);
 
        resetPuyo();
 
        answer += 1;
    }
 
    cout << answer << endl;
 
    return 0;
}
cs

 

 

 

 

728x90

'PS' 카테고리의 다른 글

프로그래머스 - 튜플  (0) 2020.11.29
프로그래머스 - 쿼드압축 후 세기  (0) 2020.11.28
프로그래머스 - 카펫  (0) 2020.11.25
프로그래머스 - 구명보트  (0) 2020.11.24
프로그래머스 - H-Index  (0) 2020.11.24