-
#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; }
시뮬레이션이라고 해야되나? 어려운문제는 확실히 아니였고, 입사 문제 였다는데, 상당히 쉬웠던거같음