728x90
시뮬레이션 문제입니다.
미세먼지를 확산시키고, 공기청정기를 통해 바람을 확산시키는 과정을 T번 반복합니다.
반복한 상태에서의 미세먼지의 총량을 출력하는 문제입니다.
미세먼지는 상하좌우 방향으로 N/5만큼 퍼져나갑니다.
그리고 퍼져나간 양만큼 원래 있던 곳의 미세먼지의 양이 줄어듭니다.
이를 위해서 map과 같은 크기의 2차원 배열을 하나 만들어서
미세먼지의 변화량을 저장한 뒤 한번에 변경해주었습니다.
그리고 공기청정기를 통해서 해당하는 방향으로 움직이게 해주었으며,
모든 과정이 끝나면 미세먼지량을 세준 뒤 출력합니다.
#include <iostream>
#include <algorithm>
#include <cstring>
#include <vector>
#include <queue>
#include <stack>
#include <string>
using namespace std;
int moveX[4] = { 0, 1, 0, -1 };
int moveY[4] = { 1, 0, -1, 0 };
int main(int argc, char *argv[])
{
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int R, C, T;
int num;
int map[60][60];
int cal[60][60];
vector<pair<int, int> > v;
queue<pair<int, int> >q;
memset(map, -1, sizeof(map));
cin >> R >> C >> T;
for (int i = 1; i <= R; ++i) {
for (int j = 1; j <= C; ++j) {
cin >> num;
map[i][j] = num;
if (num == -1) {
v.push_back({ i, j });
}
else if (num > 0) {
q.push({ i, j });
}
}
}
int c = 0;
while (c < T) {
memset(cal, 0, sizeof(cal));
while(!q.empty()){
int queueY = q.front().first;
int queueX = q.front().second;
q.pop();
int count = 0;
for (int i = 0; i < 4; ++i) {
int nextX = queueX + moveX[i];
int nextY = queueY + moveY[i];
if (map[nextY][nextX] != -1) {
++count;
cal[nextY][nextX] += map[queueY][queueX] / 5;
}
}
int sub = map[queueY][queueX] / 5;
cal[queueY][queueX] -= sub * count;
}
for (int i = 1; i <= R; ++i) {
for (int j = 1; j <= C; ++j) {
if (cal[i][j] != 0) {
map[i][j] += cal[i][j];
}
}
}
int airY = v[0].first;
int airX = v[0].second;
++airX;
int temp = 0;
int prev = 0;
while (1) {
if (map[airY][airX] == -1) {
--airX;
--airY;
break;
}
temp = map[airY][airX];
map[airY][airX] = prev;
prev = temp;
++airX;
}
while (1) {
if (map[airY][airX] == -1) {
++airY;
--airX;
break;
}
temp = map[airY][airX];
map[airY][airX] = prev;
prev = temp;
--airY;
}
while (1) {
if (map[airY][airX] == -1) {
++airX;
++airY;
break;
}
temp = map[airY][airX];
map[airY][airX] = prev;
prev = temp;
--airX;
}
while (1) {
if (map[airY][airX] == -1) {
--airY;
break;
}
temp = map[airY][airX];
map[airY][airX] = prev;
prev = temp;
++airY;
}
airY = v[1].first;
airX = v[1].second;
prev = 0;
temp = 0;
++airX;
while (1) {
if (map[airY][airX] == -1) {
--airX;
++airY;
break;
}
temp = map[airY][airX];
map[airY][airX] = prev;
prev = temp;
++airX;
}
while (1) {
if (map[airY][airX] == -1) {
--airY;
--airX;
break;
}
temp = map[airY][airX];
map[airY][airX] = prev;
prev = temp;
++airY;
}
while (1) {
if (map[airY][airX] == -1) {
++airX;
--airY;
break;
}
temp = map[airY][airX];
map[airY][airX] = prev;
prev = temp;
--airX;
}
while (1) {
if (map[airY][airX] == -1) {
++airY;
break;
}
temp = map[airY][airX];
map[airY][airX] = prev;
prev = temp;
--airY;
}
for (int i = 1; i <= R; ++i) {
for (int j = 1; j <= C; ++j) {
if (map[i][j] > 0) {
q.push({ i, j });
}
}
}
++c;
}
int result = 0;
for (int i = 1; i <= R; ++i) {
for (int j = 1; j <= C; ++j) {
if (map[i][j] != -1) {
result += map[i][j];
}
}
}
cout << result << endl;
return 0;
}
'알고리즘' 카테고리의 다른 글
[C++] 백준 9576번 책 나눠주기 (0) | 2020.02.10 |
---|---|
[C++] 백준 11931번 수 정렬하기 4 (0) | 2020.01.13 |
[C++] 백준 15685번 드래곤 커브 (0) | 2019.12.30 |
[C++] 백준 1620번 나는야 포켓몬 마스터 이다솜 (1) | 2019.12.10 |
[C++] 백준 10597번 순열장난 (0) | 2019.12.04 |