알고리즘/BOJ

[BOJ 17144] 미세먼지 안녕!

히더 2019. 5. 14. 21:25

백준 :: BOJ :: 17144 :: 미세먼지 안녕!

 

출처 : https://www.acmicpc.net/problem/17144

 

#include <bits/stdc++.h>
using namespace std;

#define F(x,y,u,p) for(int x=0; x<u; x++)for(int y=0;y<p;y++)
int ans, w, q[2][2], R, C, T, a[50][50], dd[4][2] = { {0,1},{-1,0},{0,-1},{1,0} }, dx[8] = { 0,1,2,3,0,3,2,1 };

inline bool chk(int i, int j) { return (i < 0 || j < 0 || i >= R || j >= C || a[i][j] < 0) ? false : true; }

int main() {
	cin >> R >> C >> T;
	F(i, j, R, C) { cin >> a[i][j]; if (a[i][j] < 0)q[w][0] = i,q[w++][1] = j; }
	while (T--) {
		int ta[50][50] = { 0, }, cz = 0;
		F(i, j, R, C) {
			if (a[i][j] > 4) {
				int n = a[i][j] / 5, m = 0;
				for (int d = 0; d < 4; d++) { int ni = i + dd[d][0], nj = j + dd[d][1]; if (chk(ni, nj)) { ta[ni][nj] += n; m++; } }
				a[i][j] -= n * m;
			}
		}
		F(i, j, R, C) a[i][j] += ta[i][j];
		for (int i = 0; i < 2; i++) {
			int cn = 0, cm = 0, ii = q[i][0], jj = q[i][1];
			while (1) {
				int ni = ii + dd[dx[cz]][0], nj = jj + dd[dx[cz]][1];
				if (ni == q[i][0]&&nj==0) { cz++; break; }
				if (chk(ni, nj)) { cm = a[ni][nj]; a[ni][nj] = cn; cn = cm; ii = ni; jj = nj; }
				else cz++;
			}
		}
	}
	F(i, j, R, C) if (a[i][j] > 0) ans += a[i][j];
	cout << ans;
	return 0;
}