💡 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"); } }