-
#include <iostream> #include <string.h> #include <queue> using namespace std; int r, c; char map[111][111]; bool dist[111][111]; int dx[4] = { -1, 1 , 0 , 0 }; int dy[4] = { 0, 0, -1, 1 }; int main() { ios::sync_with_stdio(false); cin >> r >> c; for (int i = 1; i <= r; i++) { for (int j = 1; j <= c; j++) { cin >> map[i][j]; } } int n; cin >> n; bool left = true; while (n--) { int height; cin >> height; height = r - height + 1; // del if (left == true) { for (int i = 1; i <= c; i++) { if (map[height][i] == 'x') { map[height][i] = '.'; break; } } } else { for (int i = c; i >= 1; i--) { if (map[height][i] == 'x') { map[height][i] = '.'; break; } } } left = !left; // check memset(dist, false, sizeof(dist)); for (int j = 1; j <= c; j++) { if (map[r][j] == 'x') { queue<pair<int, int> > q; q.push(make_pair(r, j)); dist[r][j] = true; while (!q.empty()) { int x = q.front().first; int y = q.front().second; q.pop(); for (int k = 0; k < 4; k++) { int nx = x + dx[k]; int ny = y + dy[k]; if (nx >= 1 && nx <= r && ny >= 1 && ny <= c) { if (!dist[nx][ny] && map[nx][ny] == 'x') { dist[nx][ny] = true; q.push(make_pair(nx, ny)); } } } } } } int down = r; for (int j = 1; j <= c; j++) { for (int i = r; i >= 1; i--) { if (map[i][j] == 'x' && dist[i][j] == false) { int col = r - i; for (int k = i + 1; k <= r; k++) { if (dist[k][j] == true) { col = k - i - 1; break; } } if (down > col) { down = col; } } } } for (int j = 1; j <= c; j++) { for (int i = r; i >= 1; i--) { if (i + down <= r && down != 0 && map[i][j] == 'x' && dist[i][j] == false) { map[i + down][j] = map[i][j]; map[i][j] = '.'; } } } } for (int i = 1; i <= r; i++) { for (int j = 1; j <= c; j++) { cout << map[i][j]; } cout << '\n'; } return 0; }
풀면서 진짜 구현하기 복잡했던 문제가 아닌가 싶다.
처음 막대로인해 맵이사라지는거까지는 기초적인부분이라 어렵지않았지만, 망설여지고 어려웠던부분은 아무래도
클러스터들이 나뉘는 기준과 내려갈때 클러스터 단위로 내려와서 다른하나가 다른클러스터에 닿으면 멈춰야한다는점이 구현하기 어려웠던것같다.