Notice
Recent Posts
Recent Comments
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
Archives
Today
Total
관리 메뉴

코린이 탈출기

[백준 17144] 미세먼지 안녕! 본문

문제 풀이/Simulation

[백준 17144] 미세먼지 안녕!

명란파스타 2020. 7. 20. 20:28

문제 바로가기

 

17144번: 미세먼지 안녕!

미세먼지를 제거하기 위해 구사과는 공기청정기를 설치하려고 한다. 공기청정기의 성능을 테스트하기 위해 구사과는 집을 크기가 R×C인 격자판으로 나타냈고, 1×1 크기의 칸으로 나눴다. 구사

www.acmicpc.net

까다로운 문제였다

푸는 데 두시간 걸림 ㅜㅅㅜ

노잼....

 

#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>

using namespace std;

int R, C, T;
int map[50][50];
int new_map[50][50];
int dir[50][50];
int pos[4][2] = { {1,0},{-1,0},{0,1},{0,-1} }; //아래, 위, 오, 왼
int dust_cnt;
vector<int> clean; //0: up, 1: down

bool isIn(int x, int y)
{
	if (x >= 0 && x < C && y >= 0 && y < R)
		return true;
	else
		return false;
}

void rotate()
{
	for (int i = 1; i < C - 1; i++)
	{
		dir[clean[0]][i] = 2;
		dir[clean[1]][i] = 2;
	}

	
	for (int i = 0; i < R - 1; i++)
	{
		if (i < clean[0])
			dir[i][0] = 0;
		else if (i >= clean[1])
			dir[i][C-1] = 0;
	}
	
	for (int i = 1; i < R; i++)
	{
		if (i > clean[1])
			dir[i][0] = 1;
		else if (i <= clean[0])
			dir[i][C-1] = 1;
	}

	for (int i = 1; i < C; i++)
	{
		dir[0][i] = 3;
		dir[R-1][i] = 3;
	}
}

void change_map()
{
	memset(new_map, 0, sizeof(new_map));

	for (int i = 0; i < R; i++)
	{
		for (int j = 0; j < C; j++)
		{
			int nx = j + pos[dir[i][j]][1];
			int ny = i + pos[dir[i][j]][0];

			if (isIn(nx, ny))
			{
				if (map[ny][nx] == -1)
					new_map[ny][nx] = -1;
				else
					new_map[ny][nx] = map[i][j];
			}
				
		}
	}

	for (int i = 0; i < R; i++)
	{
		for (int j = 0; j < C; j++)
		{
			map[i][j] = new_map[i][j];
			if(map[i][j] != -1)
				dust_cnt += map[i][j];
			new_map[i][j] = 0;
		}
	}
}
int main()
{
	cin >> R >> C >> T;

	for (int i = 0; i < R; i++)
	{
		for (int j = 0; j < C; j++)
		{
			cin >> map[i][j];
			if (map[i][j] == -1)
				clean.push_back(i);
		}
			
	}
	memset(dir, -1, sizeof(dir));
	rotate();

	for (int t = 0; t < T; t++)
	{
		dust_cnt = 0;
		
		for (int i = 0; i < R; i++)
		{
			for (int j = 0; j < C; j++)
			{
				if (map[i][j] > 0)
				{
					int cnt = 0;
					for (int k = 0; k < 4; k++)
					{
						int nx = j + pos[k][1];
						int ny = i + pos[k][0];

						if (isIn(nx, ny) && map[ny][nx] != -1)
						{
							new_map[ny][nx] += map[i][j] / 5;
							cnt++;
						}
					}
					new_map[i][j] -= cnt * (map[i][j] / 5);
				}
			}
		}
		for (int i = 0; i < R; i++)
		{
			for (int j = 0; j < C; j++)
			{
				map[i][j] += new_map[i][j];
			}
		}
		change_map();
	}

	cout << dust_cnt << endl;
}

'문제 풀이 > Simulation' 카테고리의 다른 글

[백준 15684] 사다리 조작  (0) 2020.07.28
[백준 14500] 테트로미노  (3) 2020.07.26
[백준 14499] 주사위 굴리기  (0) 2020.07.26
[백준 15685] 드래곤 커브  (0) 2020.07.20
[백준 14890] 경사로  (0) 2020.07.20