백준알고리즘
미세먼지 안녕!
먼지의삶
2019. 7. 28. 23:40
#include<cstdio>
#include<iostream>
#include<utility>
#include<vector>
using namespace std;
int r, c, t;
int map[2][50][50];// 먼지 오리지날 0, 퍼진상태 1, 나머지 2차원맵
int dx[] = { 0,0,1,-1 };
int dy[] = { 1,-1,0,0 };
vector<pair<int, int>> v;
void bfs(int x, int y) {//bfs인줄 알았으나.. 그냥 한칸씩만 옮기면되서 먼지움직임제어
int re = map[0][x][y] / 5;
int cnt = 0;
for (int i = 0; i < 4; i++) {
int nx = x + dx[i]; int ny = y + dy[i];
if (nx >= 0 && nx < r && ny >= 0 && ny < c) {
if (map[0][nx][ny] != -1) {
map[1][nx][ny] += re;
cnt++;
}
}
}
map[0][x][y] = map[0][x][y] - re * cnt;
}
void go() {//공기 청정기 움직임 제어
int x = v[0].first; int y = v[0].second;
vector<int> p;
for (int i = x - 1; i >= 0; i--) {
if(map[0][i+1][0] != -1) map[0][i + 1][0] = map[0][i][0];
}
for (int i = 1; i < c; i++) {
map[0][0][i - 1] = map[0][0][i];
}
for (int i = 0; i < x; i++) {
map[0][i][c-1] = map[0][i+1][c-1];
}
for (int i = c - 2; i >= 0; i--) {
if (map[0][x][i] != -1) {
map[0][x][i + 1] = map[0][x][i];
}
else map[0][x][i + 1] = 0;
}
x = v[1].first; y = v[1].second;
for (int i = x - 1; i < r; i++) {
if (map[0][i][0] != -1) map[0][i][0] = map[0][i + 1][0];
}
for (int i = 1; i < c; i++) {
map[0][r - 1][i - 1] = map[0][r - 1][i];
}
for (int i = r - 1; i > x; i--) {
map[0][i][c - 1] = map[0][i-1][c - 1];
}
for (int i = c - 2; i >= 0; i--) {
if (map[0][x][i] != -1) {
map[0][x][i + 1] = map[0][x][i];
}
else map[0][x][i + 1] = 0;
}
}
int main() {
cin >> r >> c >> t;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
cin >> map[0][i][j];
if (map[0][i][j] == -1) {
v.push_back(make_pair(i, j));
}
}
}
while (t--) {
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
bfs(i, j);//미세먼지 하나하나 다 퍼트리고
}
}
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
map[0][i][j] = map[0][i][j] + map[1][i][j];//퍼트린거 합친다음에
}
}
go();//공기 청정기 슈웅
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
map[1][i][j] = 0;//다했으면, 퍼트리는 임시 맵 초기화
}
}
}
int answer = 0;
for (int i = 0; i < r; i++) {
for (int j = 0; j < c; j++) {
answer += map[0][i][j];//먼지값 합치기 어차피 나머지는 0 청정기 -1
}
}
answer += 2;//공기청정기 -1 2개니까 +2해주고
printf("%d\n", answer);//답내기
return 0;
}
시뮬레이션이라고 해야되나? 어려운문제는 확실히 아니였고, 입사 문제 였다는데, 상당히 쉬웠던거같음