halang-log
💡 PS

[BOJ] 16768 Mooyo Mooyo

date
Feb 18, 2022
slug
boj-16768
author
status
Public
tags
PS
구현
summary
Mooyo Mooyo 문제에 대한 풀이입니다.
type
Post
thumbnail
category
💡 PS
updatedAt
Aug 3, 2023 08:56 AM
언어

문제

풀이

구현 문제이다. 풀이 과정은 다음과 같다.
1. 원래 입력 상태가 N행 10열인데, 10행 N열로 바꿔준다. 그리고 haybales이 있는 곳은(중력이 작용하는 곳은) 오른쪽으로 설정해준다. 2. while문을 통해 다음을 무한 반복을 해준다.0이 아닌 같은 수가 인접되어 있는 곳이 k이상인지 확인한다. 있다면, 해당하는 부분을 0으로 바꿔준다.만약 위에 해당하는 부분이 없다면 while문을 빠져 나온다. 3. 중력을 작용시켜 heyabales이 오른쪽으로 쏠리게 해준다. 나는 이를 덱을 사용하여 구현했다.

코드

#include <cstdio> #include <cstring> #include <queue> #include <deque> using namespace std; int dy[] = {0, 1, 0, -1}, dx[] = {-1, 0, 1, 0}; struct axis { int x, y; }; int n, k; deque<int> dq[10]; int vis[10][100]; int ans[100][10]; int isK(int ix, int iy) { int ret = 1, color = dq[ix][iy]; memset(vis, 0, sizeof(vis)); queue<axis> q; vis[ix][iy] = 1; q.push({ix, iy}); while (!q.empty()) { axis t = q.front(); q.pop(); for(int i = 0; i < 4; i++) { int x = t.x + dx[i], y = t.y + dy[i]; if (x < 0 or y < 0 or x >= 10 or y >= n) continue; if (vis[x][y] or color != dq[x][y]) continue; vis[x][y] = 1; ret++; q.push({x, y}); } } return (ret >= k) ? 1 : 0; } void toZero(int ix, int iy) { int color = dq[ix][iy]; memset(vis, 0, sizeof(vis)); queue<axis> q; vis[ix][iy] = 1; dq[ix][iy] = 0; q.push({ix, iy}); while (!q.empty()) { axis t = q.front(); q.pop(); for(int i = 0; i < 4; i++) { int x = t.x + dx[i], y = t.y + dy[i]; if (x < 0 or y < 0 or x >= 10 or y >= n) continue; if (vis[x][y] or color != dq[x][y]) continue; vis[x][y] = 1; dq[x][y] = 0; q.push({x, y}); } } } void gravity() { for(int i = 0; i < 10; i++) { int cnt = 0; for(int j = 0; j < n; j++) { int t = dq[i].back(); dq[i].pop_back(); if (t == 0) cnt++; else dq[i].push_front(t); } for(int j = 0; j < cnt; j++) dq[i].push_front(0); } } int main() { scanf("%d %d", &n, &k); for(int i = 0; i < n; i++) { for(int j = 0; j < 10; j++) { scanf("%1d", &ans[i][j]); } } for(int i = 0; i < n; i++) { for(int j = 0; j < 10; j++) { dq[j].push_back(ans[i][j]); } } while (1) { int isB = 1; for(int i = 0; i < 10; i++) { for(int j = 0; j < n; j++) { if (dq[i][j] == 0) continue; if (isK(i, j)) { isB = 0; toZero(i, j); } } } if (isB) break; gravity(); } for(int j = 0; j < n; j++) { for(int i = 0; i < 10; i++) { printf("%d", dq[i][j]); } printf("\n"); } }