์ผ์ฑ SW ์ญ๋ํ ์คํธ 2022 ์๋ฐ๊ธฐ ๊ธฐ์ถ
๋๋ฌด๋ฐ๋ฉธ
n * n ๊ฒฉ์์ ๋๋ฌด์ ๊ทธ๋ฃจ ์์ ๋ฒฝ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋๋ค.
๋๋ฌด์ ์ฑ์ฅ๊ณผ ๋ฒ์๋ ฅ์ด ์ข์์ ์ ์ด์ ๋ฅผ ๋ฟ๋ ค ๋๋ฌด์ ์ฑ์ฅ์ ์ต์ ํ๊ณ ์ ํฉ๋๋ค. ์ ์ด์ ์ ๊ฒฝ์ฐ k์ ๋ฒ์๋งํผ ๋๊ฐ์ ์ผ๋ก ํผ์ง๋ฉฐ, ๋ฒฝ์ด ์๋ ๊ฒฝ์ฐ ๊ฐ๋ก๋งํ์ ์ ํ๋์ง ์์ต๋๋ค. ๋ค์๊ณผ ๊ฐ์ด ์ด๊ธฐ ์กฐ๊ฑด์ด ์ฃผ์ด์ง๋ค๊ณ ๊ฐ์ ํ ๋, 1๋ ๋์ ๋๋ฌด์ ์ฑ์ฅ๊ณผ ์ต์ ๋ ๋ค์๊ณผ ๊ฐ์ด ์ด๋ค์ง๋๋ค.
- ์ธ์ ํ ๋ค ๊ฐ์ ์นธ ์ค ๋๋ฌด๊ฐ ์๋ ์นธ์ ์๋งํผ ๋๋ฌด๊ฐ ์ฑ์ฅํฉ๋๋ค. ์ฑ์ฅ์ ๋ชจ๋ ๋๋ฌด์๊ฒ ๋์์ ์ผ์ด๋ฉ๋๋ค.
(์ค๋ต)
๊ฐ 3๊ฐ์ ๊ณผ์ ์ด 1๋ ์ ๊ฑธ์ณ ์งํ๋๋ค๊ณ ํ์ ๋, m๋ ๋์ ์ด ๋ฐ๋ฉธํ ๋๋ฌด์ ๊ทธ๋ฃจ ์๋ฅผ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํด๋ณด์ธ์.
์ ๋ ฅ ํ์
์ฒซ ๋ฒ์งธ ์ค์ ๊ฒฉ์์ ํฌ๊ธฐ n, ๋ฐ๋ฉธ์ด ์งํ๋๋ ๋ ์ m, ์ ์ด์ ์ ํ์ฐ ๋ฒ์ k, ์ ์ด์ ๊ฐ ๋จ์์๋ ๋ ์ c๊ฐ ๊ณต๋ฐฑ์ ์ฌ์ด์ ๋๊ณ ์ฃผ์ด์ง๋๋ค.
์ดํ n๊ฐ์ ์ค์ ๊ฑธ์ณ ๊ฐ ์นธ์ ๋๋ฌด์ ๊ทธ๋ฃจ ์, ๋ฒฝ์ ์ ๋ณด๊ฐ ์ฃผ์ด์ง๋๋ค. ์ด ๋๋ฌด์ ๊ทธ๋ฃจ ์๋ 1 ์ด์ 100 ์ดํ์ ์๋ก, ๋น ์นธ์ 0, ๋ฒฝ์ -1์ผ๋ก ์ฃผ์ด์ง๊ฒ ๋ฉ๋๋ค.
- 5 ≤ n ≤ 20
- 1 ≤ m ≤ 1000
- 1 ≤ k ≤ 20
- 1 ≤ c ≤ 10
์ถ๋ ฅ ํ์
m๋ ๋์ ์ด ๋ฐ๋ฉธํ ๋๋ฌด์ ๊ทธ๋ฃจ ์๋ฅผ ๊ตฌํ์ธ์.
์ ๊ณต๋ ์์ ํ ์คํธ์ผ์ด์ค๊ฐ ๋ชจ๋ ๋ง๊ธฐ๊น์ง 1์๊ฐ ๋ฐ์ด ๊ฑธ๋ ธ๋ค.
๊ทผ๋ฐ ์ ์ถํ๋ ํ ์ผ 7๋ฒ์์ ํ๋ฆผ!!
๊ทผ๋ฐ ์๋ชป๋๊ฑฐ ๋ช๊ฐ ๊ณ ์ณค๋๋ฐ ๊ณ์ ๋ต์ด ์์ ๋ฒ์๋ก ํ๋ฆฌ๊ฒ ๋์ค๋๊ฑฐ์
ใ 3์๊ฐ๋์ ๊ณ์ ๊ณ ์ณ๋ ํ๋ ค์ ๊ทธ๋ฅ ํฌ๊ธฐํ๊ณ ํด์ค์ ๋ด๋ฒ๋ ธ๋ค~~^^ ํ๋ฑ์ง๋
ํด์ค ํ์ด
#include <iostream>
#define MAX_N 20
#define DIR_NUM 4
using namespace std;
int n, m, k, c;
int tree[MAX_N + 1][MAX_N + 1];
int add_tree[MAX_N + 1][MAX_N + 1];
int herb[MAX_N + 1][MAX_N + 1];
int ans;
bool IsOutRange(int x, int y) {
return !(1 <= x && x <= n && 1 <= y && y <= n);
}
// ์
๋ ฅ์ ๋ฐ๋ ๋ฑ ์ด๊ธฐ ์์
์ ํฉ๋๋ค.
void Init() {
cin >> n >> m >> k >> c;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
cin >> tree[i][j];
}
// 1๋จ๊ณ : ์ธ์ ํ ๋ค ๊ฐ์ ์นธ ์ค ๋๋ฌด๊ฐ ์๋ ์นธ์ ์๋งํผ ๋๋ฌด๊ฐ ์ฑ์ฅํฉ๋๋ค.
void StepOne() {
int dx[DIR_NUM] = {-1, 0, 1, 0};
int dy[DIR_NUM] = { 0, -1, 0, 1};
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) {
if(tree[i][j] <= 0) continue;
// ๋๋ฌด๊ฐ ์๋ ์นธ์ ์(cnt)๋งํผ ๋๋ฌด๊ฐ ์ฑ์ฅํฉ๋๋ค.
int cnt = 0;
for(int dir = 0; dir < 4; dir++) {
int nx = i + dx[dir];
int ny = j + dy[dir];
if(IsOutRange(nx, ny)) continue;
if(tree[nx][ny] > 0) cnt++;
}
tree[i][j] += cnt;
}
}
// 2๋จ๊ณ : ๊ธฐ์กด์ ์์๋ ๋๋ฌด๋ค์ ์๋ฌด๊ฒ๋ ์๋ ์นธ์ ๋ฒ์์ ์งํํฉ๋๋ค.
void StepTwo() {
int dx[DIR_NUM] = {-1, 0, 1, 0};
int dy[DIR_NUM] = { 0, -1, 0, 1};
// ๋ชจ๋ ๋๋ฌด์์ ๋์์ ์ผ์ด๋๋ ๊ฒ์ ๊ตฌํํ๊ธฐ ์ํด ํ๋์ ๋ฐฐ์ด์ ๋ ์ด์ฉํฉ๋๋ค.
// add_tree๋ฅผ ์ด๊ธฐํํด์ค๋๋ค.
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
add_tree[i][j] = 0;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) {
if(tree[i][j] <= 0) continue;
// ํด๋น ๋๋ฌด์ ์ธ์ ํ ๋๋ฌด ์ค ์๋ฌด๋ ์๋ ์นธ์ ๊ฐ์๋ฅผ ์ฐพ์ต๋๋ค.
int cnt = 0;
for(int dir = 0; dir < 4; dir++) {
int nx = i + dx[dir];
int ny = j + dy[dir];
if(IsOutRange(nx, ny)) continue;
if(herb[nx][ny]) continue;
if(tree[nx][ny] == 0) cnt++;
}
// ์ธ์ ํ ๋๋ฌด ์ค ์๋ฌด๋ ์๋ ์นธ์ cnt๋ก ๋๋ ์ค ๋งํผ ๋ฒ์ํฉ๋๋ค.
for(int dir = 0; dir < 4; dir++) {
int nx = i + dx[dir];
int ny = j + dy[dir];
if(IsOutRange(nx, ny)) continue;
if(herb[nx][ny]) continue;
if(tree[nx][ny] == 0) add_tree[nx][ny] += tree[i][j] / cnt;
}
}
// add_tree๋ฅผ ๋ํด ๋ฒ์์ ๋์์ ์งํ์ํต๋๋ค.
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) tree[i][j] += add_tree[i][j];
}
// 3๋จ๊ณ : ๊ฐ์ฅ ๋ง์ด ๋ฐ๋ฉธ๋๋ ์นธ์ ์ ์ด์ ๋ฅผ ๋ฟ๋ฆฝ๋๋ค.
void StepThree() {
int dx[DIR_NUM] = {-1, 1, 1, -1};
int dy[DIR_NUM] = {-1, -1, 1, 1};
int max_del = 0;
int max_x = 1;
int max_y = 1;
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++) {
// ๋ชจ๋ ์นธ์ ๋ํด ์ ์ด์ ๋ฅผ ๋ฟ๋ ค๋ด
๋๋ค. ๊ฐ ์นธ์์ ์ ์ด์ ๋ฅผ ๋ฟ๋ฆด ์ ๋ฐ๋ฉธ๋๋ ๋๋ฌด์ ๊ทธ๋ฃจ ์๋ฅผ ๊ณ์ฐํ๊ณ ,
// ์ด ๊ฐ์ด ์ต๋๊ฐ ๋๋ ์ง์ ์ ์ฐพ์์ค๋๋ค.
if(tree[i][j] <= 0) continue;
int cnt = tree[i][j];
for(int dir = 0; dir < 4; dir++) {
int nx = i;
int ny = j;
for(int x = 1; x <= k; x++) {
nx = nx + dx[dir];
ny = ny + dy[dir];
if(IsOutRange(nx, ny)) break;
if(tree[nx][ny] <= 0) break;
cnt += tree[nx][ny];
}
}
if(max_del < cnt) {
max_del = cnt;
max_x = i;
max_y = j;
}
}
ans += max_del;
// ์ฐพ์ ์นธ์ ์ ์ด์ ๋ฅผ ๋ฟ๋ฆฝ๋๋ค.
if(tree[max_x][max_y] > 0) {
tree[max_x][max_y] = 0;
herb[max_x][max_y] = c;
for(int dir = 0; dir < 4; dir++) {
int nx = max_x;
int ny = max_y;
for(int x = 1; x <= k; x++) {
nx = nx + dx[dir];
ny = ny + dy[dir];
if(IsOutRange(nx, ny)) break;
if(tree[nx][ny] < 0) break;
if(tree[nx][ny] == 0) {
herb[nx][ny] = c;
break;
}
tree[nx][ny] = 0;
herb[nx][ny] = c;
}
}
}
}
// ์ ์ด์ ์ ๊ธฐ๊ฐ์ 1๋
๊ฐ์์ํต๋๋ค.
void DeleteHerb() {
for(int i = 1; i <= n; i++)
for(int j = 1; j <= n; j++)
if(herb[i][j] > 0)
herb[i][j] -= 1;
}
int main() {
// ์
๋ ฅ์ ๋ฐ๋ ๋ฑ ์ด๊ธฐ ์์
์ ํฉ๋๋ค.
Init();
for(int i = 1; i <= m; i++) {
// 1๋จ๊ณ : ์ธ์ ํ ๋ค ๊ฐ์ ์นธ ์ค ๋๋ฌด๊ฐ ์๋ ์นธ์ ์๋งํผ ๋๋ฌด๊ฐ ์ฑ์ฅํฉ๋๋ค.
StepOne();
// 2๋จ๊ณ : ๊ธฐ์กด์ ์์๋ ๋๋ฌด๋ค์ ์๋ฌด๊ฒ๋ ์๋ ์นธ์ ๋ฒ์์ ์งํํฉ๋๋ค.
StepTwo();
// ์ ์ด์ ์ ๊ธฐ๊ฐ์ 1๋
๊ฐ์์ํต๋๋ค.
DeleteHerb();
// 3๋จ๊ณ : ๊ฐ์ฅ ๋ง์ด ๋ฐ๋ฉธ๋๋ ์นธ์ ์ ์ด์ ๋ฅผ ๋ฟ๋ฆฝ๋๋ค.
StepThree();
}
cout << ans;
return 0;
}
'๐ ์๊ณ ๋ฆฌ์ฆ > Code Tree' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[์ฝ๋ํธ๋ฆฌ] ์ฝ๋ํธ๋ฆฌ๋นต - ์๋ฎฌ๋ ์ด์ (๊ธฐ์ถ๋ฌธ์ ) (0) | 2023.04.08 |
---|---|
[์ฝ๋ํธ๋ฆฌ] ์ธ์๋ - ์๋ฎฌ๋ ์ด์ (๊ธฐ์ถ๋ฌธ์ ) (0) | 2023.04.07 |
[์ฝ๋ํธ๋ฆฌ] ์์ ์ฑ - ์๋ฎฌ๋ ์ด์ , BFS/DFS (๊ธฐ์ถ๋ฌธ์ ) (2) | 2023.04.06 |
[์ฝ๋ํธ๋ฆฌ] BFS ํ์ / ๊ฐ ์ ์๋ ๊ณณ๋ค (0) | 2023.02.22 |
[์ฝ๋ํธ๋ฆฌ] BFS ํ์ / ๋ค ๋ฐฉํฅ ํ์ถ ๊ฐ๋ฅ ์ฌ๋ถ ํ๋ณํ๊ธฐ (0) | 2023.02.22 |