๋ฌธ์ ๋งํฌ
https://www.acmicpc.net/problem/16235
16235๋ฒ: ๋๋ฌด ์ฌํ ํฌ
๋ถ๋์ฐ ํฌ์๋ก ์ต๋์ ๋์ ๋ฒ ์๋๋ ์ต๊ทผ N×N ํฌ๊ธฐ์ ๋ ์ ๊ตฌ๋งคํ๋ค. ์๋๋ ์์ฌ์ด ๋ ๊ด๋ฆฌ๋ฅผ ์ํด ๋ ์ 1×1 ํฌ๊ธฐ์ ์นธ์ผ๋ก ๋๋์ด ๋์๋ค. ๊ฐ๊ฐ์ ์นธ์ (r, c)๋ก ๋ํ๋ด๋ฉฐ, r์ ๊ฐ์ฅ ์์์๋ถํฐ
www.acmicpc.net
๋จ์ํ ๊ตฌํ ๋ฌธ์ .
ํ์ด
์ด๊ธฐ ์๋ถ์ ๋ชจ๋ ์นธ์ด 5๋ก ๋์ผํ๋ค๋ ๋ฌธ์ ์กฐ๊ฑด์ ์์ฝ์ด์ ๊ณ์ ๋ชปํ๊ณ ์์๋ค. ํญ์ ๋๋ผ๋ ๊ฑฐ์ง๋ง ๋ฌธ์ ๋ฅผ ์ ์ฝ์ด์ผํ๋ค *^^*
๊ฐ ์นธ์ ์ฌ๋ฌ๊ฐ์ ๋๋ฌด๊ฐ ์์ ์๋ ์์ผ๋ฏ๋ก ๋ฒกํฐ๋ฅผ 2์ฐจ์์ผ๋ก ์ ์ธํด์ ๊ฐ ์ขํ๋ง๋ค ๋๋ฌด์ ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ณ์ ๋ง๋ค ํจ์๋ฅผ ๋ง๋ค์ด์ ๊ณ์ ๋ง๋ค ์์ ์ ํด์ฃผ์๋ค.
1. ๋ด & ์ฌ๋ฆ
๋ด์๋ ๋๋ฌด๊ฐ ์์ ์ ๋์ด๋งํผ ์๋ถ์ ๋จน๊ณ ๋์ด๊ฐ 1์ฆ๊ฐํ๋ค.
"๋ง์ฝ ๋๋ฌด๊ฐ ์ฌ๋ฌ๊ฐ์ธ ๊ฒฝ์ฐ ์ด๋ฆฐ ๋๋ฌด๋ถํฐ ์๋ถ์ ์ญ์ทจํ๋ค." ๋ผ๋ ์กฐ๊ฑด์ด ์๊ธฐ ๋๋ฌธ์ ๋ด์ด ์์๋๊ธฐ์ ๋ชจ๋ ๋๋ฌด๋ฒกํฐ๋ฅผ ๋์ด์์ผ๋ก ์ ๋ ฌํด์ฃผ์ด์ผ ํ๋ค.
์๋ถ์ด ๋ถ์กฑํด์ ๋จน์ง๋ชปํ ๋๋ฌด๋ ์ฆ์ ์ฃฝ๊ณ ์๋ถ์ด ๋์ด์ผํ๊ธฐ๋๋ฌธ์
์์์ (i, j) ์ขํ์ ๋๋ฌด๋ฅผ ๊ธฐ์ค์ผ๋ก, ๋ง์ฝ์ k๋ฒ์งธ ๋๋ฌด๋ถํฐ ์๋ถ์ ๋ชปํ๋ค๊ณ ํ๋ฉด k๋ฒ์งธ ๋๋ฌด๋ถํฐ ๋ง์ง๋ง ๋๋ฌด๊น์ง๋ ๋ชจ๋ ์ฃฝ๊ณ ์๋ถ์ด ๋์ด์ผํ๋ค. ์ฃฝ๋ ๋๋ฌด๋ค์ ๋์ด / 2 ์ ์ดํฉ์ ์ ์ฅํด๋๊ณ (i, j) ์ขํ์ ์๋ถ์ ์ถ๊ฐํด์ค๋ค.
๊ทธ๋ฆฌ๊ณ ์ฃฝ์ ๋๋ฌด๋ค์ ๋ฒกํฐ์์ ์ญ์ ํ๋ค.
์ด๋ ๊ฒํ๋ฉด ๋ด๊ณผ ์ฌ๋ฆ์ ๋์์ ์ฒ๋ฆฌํ ์ ์๋ค.
void Spring_Summer() {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (tree[i][j].empty())
continue;
int nutrition = 0;
int k;
vector<int> alive;
for (k = 0; k < tree[i][j].size(); k++) {
if (B[i][j] >= tree[i][j][k]) { //์๋ถ์ด ๋จ์์์ผ๋ฉด
B[i][j] -= tree[i][j][k];
tree[i][j][k]++; //๋์ด 1์ฆ๊ฐ
alive.push_back(tree[i][j][k]);
}
else break;
}
for (int t = k; t < tree[i][j].size(); t++)
nutrition += (tree[i][j][t] / 2);
tree[i][j].clear();
tree[i][j] = alive;
B[i][j] += nutrition;
}
}
}โ
์ฌ๊ธฐ์ B ๋ฐฐ์ด์ ๊ฐ ์ขํ๋ง๋ค ๋จ์์๋ ์๋ถ์ ์์ด๋ค.
2. ๊ฐ์
๊ฐ์์๋ ๋์ด๊ฐ 5์ ๋ฐฐ์์ธ ๋๋ฌด๋ค์ด ๋ฒ์์ ํ๋ ์๊ธฐ์ด๋ค.
๊ฐ ์ขํ๋ฅผ ๋๋ฉด์ ๋ง์ฝ ๋์ด๊ฐ 5์ธ ๋๋ฌด๊ฐ ์๋ค๋ฉด ์ธ์ ํ ์ง์ญ์ ๋์ด๊ฐ 1์ธ ๋๋ฌด๋ฅผ ์ถ๊ฐํด์ฃผ๋ฉด ๋๋ค.
์ธ์ ํ ์ง์ญ์ ์ขํ๋ dx[], dy[] ๋ฐฐ์ด์ ๋ง๋ค์ด์ ์ธ์ ํ ์ง์ญ์ ์ขํ๋ฅผ ์ฐพ์์คฌ๋ค.
void Fall() {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (tree[i][j].empty())
continue;
for (int k = 0; k < tree[i][j].size(); k++) {
if (tree[i][j][k] % 5 == 0) { //๋ฒ์ ๊ฐ๋ฅ
for (int p = 0; p < 8; p++) {
pair<int, int> adjacent = { i + dy[p], j + dx[p] };
if (is_ok(adjacent.first, adjacent.second))
tree[adjacent.first][adjacent.second].push_back(1);
}
}
}
}
}
}
3. ๊ฒจ์ธ
๊ฒจ์ธ์๋ ์ด๊ธฐ์ ์ ๋ ฅ๋ฐ์ A๋ฐฐ์ด์ ๊ธฐ์ค์ผ๋ก ๋ชจ๋ ์ขํ์ A๋ฐฐ์ด์ ์ ์ฅ๋ ๊ฐ๋งํผ ์๋ถ์ ์ถฉ์ ํด์ฃผ๋ฉด ๋๋ค.
void Winter() {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
B[i][j] += A[i][j];
}
}
}
์ด ํจ์๋ค์ ์ด์ฉํด์ ์ฝ๋๋ฅผ ์์ฑํ๋ฉด ๋๋ค.
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
|
#define _CRT_SECURE_NO_WARNINGS
#include <iostream>
#include <cstdio>
#include <string.h>
#include <string>
#include <stack>
#include <vector>
#include <math.h>
#include <queue>
#include <climits>
#include <algorithm>
#include <iomanip>
#include <map>
#define mod 998244353
using namespace std;
typedef long long ll;
typedef priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 10 + 5;
int A[MAX_N][MAX_N];
int B[MAX_N][MAX_N];
int dx[] = { 0,1,0,-1,1,-1,1,-1 };
int dy[] = { 1,0,-1,0,1,1,-1,-1 };
vector<int> tree[MAX_N][MAX_N];
int N, M, K;
bool is_ok(int y, int x) {
if (x <= 0 || x > N || y <= 0 || y > N)
return false;
return true;
}
void Spring_Summer() {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (tree[i][j].empty())
continue;
int nutrition = 0;
int k;
vector<int> alive;
for (k = 0; k < tree[i][j].size(); k++) {
if (B[i][j] >= tree[i][j][k]) { //์๋ถ์ด ๋จ์์์ผ๋ฉด
B[i][j] -= tree[i][j][k];
tree[i][j][k]++; //๋์ด 1์ฆ๊ฐ
alive.push_back(tree[i][j][k]);
}
else break;
}
for (int t = k; t < tree[i][j].size(); t++)
nutrition += (tree[i][j][t] / 2);
tree[i][j].clear();
tree[i][j] = alive;
B[i][j] += nutrition;
}
}
}
void Fall() {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (tree[i][j].empty())
continue;
for (int k = 0; k < tree[i][j].size(); k++) {
if (tree[i][j][k] % 5 == 0) { //๋ฒ์ ๊ฐ๋ฅ
for (int p = 0; p < 8; p++) {
pair<int, int> adjacent = { i + dy[p], j + dx[p] };
if (is_ok(adjacent.first, adjacent.second))
tree[adjacent.first][adjacent.second].push_back(1);
}
}
}
}
}
}
void Winter() {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
B[i][j] += A[i][j];
}
}
}
void sort_tree() {
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
sort(tree[i][j].begin(), tree[i][j].end());
}
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> N >> M >> K;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
cin >> A[i][j];
B[i][j] = 5;
}
}
for (int i = 0; i < M; i++) {
int y, x, z;
cin >> y >> x >> z;
tree[y][x].push_back(z);
}
while (K--) {
sort_tree();
Spring_Summer();
Fall();
Winter();
}
int ans = 0;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
ans += tree[i][j].size();
}
}
cout << ans << "\n";
return 0;
}
|
cs |
'๋ฐฑ์ค > Gold' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 17143 : ๋์์ (0) | 2022.05.11 |
---|---|
[BOJ] 17144 : ๋ฏธ์ธ๋จผ์ง ์๋ ! (0) | 2022.05.11 |
[BOJ] 16234 : ์ธ๊ตฌ ์ด๋ (0) | 2022.05.10 |
[BOJ] 15686 : ์นํจ ๋ฐฐ๋ฌ (0) | 2022.05.09 |
[BOJ] 15685 : ๋๋๊ณค ์ปค๋ธ (0) | 2022.05.09 |