문제 출처: https://www.acmicpc.net/problem/16918
Silver 1
문제를 읽고 구현하는 문제. 그래프 탐색을 적절히 이용하면 됐다.
#include <iostream>
#include <algorithm>
#include <queue>
#define INF 987654321
using namespace std;
char arr[201][201];
int R, C, N;
int dy[4][2] = { {-1,0},{1,0},{0,-1},{0,1} };
void allInstall() {
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
arr[i][j] = 'O';
}
}
}
int main() {
cin >> R >> C >> N;
queue<pair<int, int>> q;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
cin >> arr[i][j];
if (arr[i][j] == 'O') {
q.push({ i,j });
}
}
}
bool flag = true;
while (--N) { // N초가 다 지나고 N+1번째 격자판 상태가 아닌, N-1초가 지나고 N번째 격자판 상태를 보여주기 위함
if (flag) {
allInstall();
flag = false;
continue;
}
while (!q.empty()) {
int x = q.front().first;
int y = q.front().second;
arr[x][y] = '.';
q.pop();
for (int k = 0; k < 4; k++) {
int nx = x + dy[k][0];
int ny = y + dy[k][1];
if (nx < 0 || ny < 0 || nx >= R || ny >= C || arr[nx][ny] == '.') continue;
arr[nx][ny] = '.';
}
}
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
if (arr[i][j] == 'O') {
q.push({ i,j });
}
}
}
flag = true;
}
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
cout << arr[i][j];
}
cout << "\n";
}
return 0;
}