백준알고리즘

미세먼지 안녕!

먼지의삶 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;
}

시뮬레이션이라고 해야되나? 어려운문제는 확실히 아니였고, 입사 문제 였다는데, 상당히 쉬웠던거같음