Skip to content

Instantly share code, notes, and snippets.

@niklasjang
Created April 12, 2020 11:56
Show Gist options
  • Select an option

  • Save niklasjang/74e8b79519f90ab98cc034c4ca6551eb to your computer and use it in GitHub Desktop.

Select an option

Save niklasjang/74e8b79519f90ab98cc034c4ca6551eb to your computer and use it in GitHub Desktop.
[PS][시뮬레이션][순환시키기]/[BOJ][17144][미세먼지 안녕!]
#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