[코드트리] 시공의 폭풍

rhkr9080·2023년 8월 10일
0

코드트리

목록 보기
11/29

문제링크 : https://www.codetree.ai/training-field/frequent-problems/problems/heros-of-storm/description?page=2&pageSize=20

💻 문제 풀이 : C++

#include <iostream>
#include <cstring>

using namespace std;

struct Coord {
	int row, col;
};

int n, m, t;
int map[55][55];
int tmpMap[55][55];
Coord up;
Coord down;

int dr[] = { 0, 0, -1, 1 };
int dc[] = { -1, 1, 0, 0 };

void INPUT()
{
	cin >> n >> m >> t;
	int flag = 0;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cin >> map[i][j];
			if (map[i][j] == -1 && flag == 0)
			{
				flag = 1;
				up = { i ,j };
				down = { i + 1, j };
			}
		}
	}
}

void CLEAR()
{
	n = m = t = 0;
	memset(map, 0, sizeof(map));
	memset(tmpMap, 0, sizeof(tmpMap));
}

int getSumDust()
{
	int sum = 0;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			if (map[i][j] == -1) continue;
			sum += map[i][j];
		}
	}
	return sum;
}

void spreadDust()
{
	memset(tmpMap, 0, sizeof(tmpMap));
	// 확산
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			if (map[i][j] < 5) continue;
			int tmpDust = map[i][j] / 5;
			int sumDust = 0;
			for (int k = 0; k < 4; k++)
			{
				int nextRow = i + dr[k];
				int nextCol = j + dc[k];
				if (nextRow < 0 || nextCol < 0 || nextRow >= n || nextCol >= m) continue;
				if (map[nextRow][nextCol] == -1) continue;
				sumDust += tmpDust;
				tmpMap[nextRow][nextCol] += tmpDust;
			}
			map[i][j] -= sumDust;
		}
	}
	// 먼지 더하기
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			map[i][j] += tmpMap[i][j];
		}
	}
}

void cleanUpside()
{
	int tmpOne = map[up.row][m - 1];
	for (int i = m - 1; i > 1; i--)
	{
		map[up.row][i] = map[up.row][i - 1];
	}
	map[up.row][up.col + 1] = 0;
	int tmpTwo = map[0][m - 1];
	for (int i = 0; i < up.row - 1; i++)
	{
		map[i][m - 1] = map[i + 1][m - 1];
	}
	map[up.row - 1][m - 1] = tmpOne;
	tmpOne = map[0][1];
	for (int i = 1 ; i < m - 1; i++)
	{
		map[0][i] = map[0][i + 1];
	}
	map[0][m - 2] = tmpTwo;
	for (int i = up.row - 1; i > 0; i--)
	{
		map[i][0] = map[i - 1][0];
	}
	map[0][0] = tmpOne;
}

void cleanDownside()
{
	int tmpOne = map[down.row][m - 2];
	for (int i = m - 2; i > 1; i--)
	{
		map[down.row][i] = map[down.row][i - 1];
	}
	map[down.row][down.col + 1] = 0;
	int tmpTwo = map[n - 2][m - 1];
	for (int i = n - 2; i > down.row; i--)
	{
		map[i][m-1] = map[i - 1][m - 1];
	}
	map[down.row][m - 1] = tmpOne;
	tmpOne = map[n - 1][1];
	for (int i = 1; i < m - 1; i++)
	{
		map[n - 1][i] = map[n - 1][i + 1];
	}
	map[n - 1][m - 1] = tmpTwo;
	for (int i = down.row + 1; i < n; i++)
	{
		map[i][0] = map[i + 1][0];
	}
	map[n - 1][0] = tmpOne;
}

void cleanDust()
{
	cleanUpside();
	cleanDownside();
}

void SOLVE()
{
	for (int i = 0; i < t; i++)
	{
		spreadDust();
		int debug = 1;
		cleanDust();
		debug = 0;
	}
	int debug = 0;
	cout << getSumDust() << "\n";
}

int main()
{
	CLEAR();
	INPUT();
	SOLVE();

	return 0;
}

📌 memo 😊

profile
공부방

0개의 댓글