Created
April 12, 2020 11:56
-
-
Save niklasjang/74e8b79519f90ab98cc034c4ca6551eb to your computer and use it in GitHub Desktop.
[PS][시뮬레이션][순환시키기]/[BOJ][17144][미세먼지 안녕!]
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #include <iostream> | |
| #include <string.h> | |
| using namespace std; | |
| int n,m,t; | |
| int map[51][51]; | |
| int dust[51][51]; | |
| pair<int, int> u = { -1,-1 }; | |
| pair<int, int> d = { -1,-1 }; | |
| int dx[] = { 0,0,1,-1 }; | |
| int dy[] = { 1,-1,0,0 }; | |
| void getInput(void) { | |
| cin >> n >> m >> t; | |
| for (int i = 0; i < n; i++) { | |
| for (int j = 0; j < m; j++) { | |
| cin >> map[i][j]; | |
| if (map[i][j] == -1) { | |
| if (u.first == -1) { | |
| u.first = i; | |
| u.second = j; | |
| } | |
| else { | |
| d.first = i; | |
| u.second = j; | |
| } | |
| } | |
| } | |
| } | |
| } | |
| bool inRange(int x, int y) { | |
| return 0 <= x && 0 <= y && x < n && y < m && map[x][y] != -1; | |
| } | |
| void solve(void) { | |
| int s,i,j,k; | |
| int nx, ny; | |
| int cnt, ans = 0; | |
| for (s= 0; s < t; s++) { | |
| //확산 | |
| for (i = 0; i < n; i++) { | |
| for (j = 0; j < m; j++) { | |
| if (map[i][j]) { | |
| cnt = 0; | |
| for (k = 0; k < 4; k++) { | |
| nx = i + dx[k]; | |
| ny = j + dy[k]; | |
| if (!inRange(nx, ny)) continue; | |
| cnt++; | |
| dust[nx][ny] += map[i][j] / 5; | |
| } | |
| map[i][j] -= (cnt * (map[i][j] / 5)); | |
| } | |
| } | |
| } | |
| for (i = 0; i < n; i++) for (j = 0; j < m; j++) { | |
| map[i][j] += dust[i][j]; | |
| dust[i][j] = 0; | |
| } | |
| //바람불기 | |
| for (i = u.first - 1; i >= 1; i--) map[i][0] = map[i - 1][0]; | |
| for (j = 0; j <= m - 2; j++) map[0][j] = map[0][j + 1]; | |
| for (i = 0; i <= u.first - 1; i++) map[i][m - 1] = map[i + 1][m - 1]; | |
| for (j = m - 1; j >= 1; j--) map[u.first][j] = map[u.first][j - 1]; | |
| map[u.first][1] = 0; | |
| for (i = d.first + 1; i <= n - 2; i++) map[i][0] = map[i + 1][0]; | |
| for (j = 0; j <= m - 2; j++) map[n-1][j] = map[n-1][j + 1]; | |
| for (i = n - 1; i >= d.first+1; i--) map[i][m - 1] = map[i - 1][m - 1]; | |
| for (j = m - 1; j >= 1; j--) map[d.first][j] = map[d.first][j - 1]; | |
| map[d.first][1] = 0; | |
| } | |
| for (int i = 0; i < n; i++) { | |
| for (int j = 0; j < m; j++) { | |
| if (map[i][j] > 0) ans += map[i][j]; | |
| } | |
| } | |
| cout << ans << "\n"; | |
| } | |
| int main(void) { | |
| getInput(); | |
| solve(); | |
| return 0; | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment