๋ฌธ์ ๋งํฌ
21609๋ฒ: ์์ด ์คํ๊ต (acmicpc.net)
21609๋ฒ: ์์ด ์คํ๊ต
์์ด ์คํ๊ต์ ์ฝ๋ฉ ๋์๋ฆฌ์์ ๊ฒ์์ ๋ง๋ค์๋ค. ์ด ๊ฒ์์ ํฌ๊ธฐ๊ฐ N×N์ธ ๊ฒฉ์์์ ์งํ๋๊ณ , ์ด๊ธฐ์ ๊ฒฉ์์ ๋ชจ๋ ์นธ์๋ ๋ธ๋ก์ด ํ๋์ฉ ๋ค์ด์๊ณ , ๋ธ๋ก์ ๊ฒ์์ ๋ธ๋ก, ๋ฌด์ง๊ฐ ๋ธ๋ก, ์ผ๋ฐ ๋ธ๋ก
www.acmicpc.net
์์ด ์ด๋ฑํ๊ต์ ์ด์ด์ ์์ด ์คํ๊ต ๋ฌธ์ . ์ญ์ ๊ตฌํ๋ฌธ์ ๋ค.
ํ์ด
N x N์ผ๋ก ์ฃผ์ด์ง ๊ฒฉ์๋ฅผ ์ฃผ์ด์ง ๊ณผ์ ์ ๋ฐ๋ผ ๋ธ๋ก๊ทธ๋ฃน์ ์ญ์ ํ๋ ๊ฒ์.
์ต์ข ์ ์๋ฅผ ์ถ๋ ฅํ์.
๋ธ๋ก ๊ทธ๋ฃน์๋ ๋ฐ๋์ ๊ฐ์ ์๊น์ ๋ธ๋ก๋ค์ด ํฌํจ๋์ด์ผํ๋ฉฐ, ๋ฌด์ง๊ฐ ๋ธ๋ก์ ์ด๋ ๊ทธ๋ฃน์๋ ํฌํจ๋ ์ ์๋ค. ๊ทธ๋ฆฌ๊ณ ๊ฒ์์ ๋ธ๋ก์ ์ด๋ค ๊ทธ๋ฃน์๋ ๋ค์ด๊ฐ ์ ์๋ค. ์ด๋ ๋ธ๋ก๊ทธ๋ฃน์ ์ผ๋ฐ ๋ธ๋ก์ด 1๊ฐ ์ด์ ๋ค์ด๊ฐ์ผํ๋ฉฐ ๊ทธ๋ฃน์ ํฌ๊ธฐ๋ 2 ์ด์์ด์ด์ผ ํ๋ค.
1. ํฌ๊ธฐ๊ฐ ๊ฐ์ฅ ํฐ ๋ธ๋ก ๊ทธ๋ฃน์ ์ฐพ๋๋ค. ๊ทธ๋ฌํ ๋ธ๋ก ๊ทธ๋ฃน์ด ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ํฌํจ๋ ๋ฌด์ง๊ฐ ๋ธ๋ก์ ์๊ฐ ๊ฐ์ฅ ๋ง์ ๋ธ๋ก ๊ทธ๋ฃน, ๊ทธ๋ฌํ ๋ธ๋ก๋ ์ฌ๋ฌ๊ฐ๋ผ๋ฉด ๊ธฐ์ค ๋ธ๋ก์ ํ์ด ๊ฐ์ฅ ํฐ ๊ฒ์, ๊ทธ ๊ฒ๋ ์ฌ๋ฌ๊ฐ์ด๋ฉด ์ด์ด ๊ฐ์ฅ ํฐ ๊ฒ์ ์ฐพ๋๋ค.
2. 1์์ ์ฐพ์ ๋ธ๋ก ๊ทธ๋ฃน์ ๋ชจ๋ ๋ธ๋ก์ ์ ๊ฑฐํ๋ค. ๋ธ๋ก ๊ทธ๋ฃน์ ํฌํจ๋ ๋ธ๋ก์ ์๋ฅผ B๋ผ๊ณ ํ์ ๋, B2์ ์ ํ๋ํ๋ค.
3. ๊ฒฉ์์ ์ค๋ ฅ์ด ์์ฉํ๋ค.
4. ๊ฒฉ์๊ฐ 90๋ ๋ฐ์๊ณ ๋ฐฉํฅ์ผ๋ก ํ์ ํ๋ค.
5. ๋ค์ ๊ฒฉ์์ ์ค๋ ฅ์ด ์์ฉํ๋ค.
์ ์ํ๋ ๊ณผ์ ์ ์์ ๊ฐ๋ค.
๋จผ์ ์ ์ฅํ๊ณ ์์ด์ผ ํ ์ ๋ณด๋ค์ด ๋ญ๊ฐ ์๋์ง ์๊ฐํด๋ณด์.
1. ํ์ฌ ๊ฒฉ์ํ์ ์ํฉ์ ์ ์ฅํด์ผํ๋ค.
A[20][20] ์ ๋ฐฐ์ด์ ๋ง๋ค์ด์ ์ ์ฅํด๋์๋ค.
2. ๋ธ๋ก ๊ทธ๋ฃน์ ํ์ํ ๋ ํด๋น ์นธ์ ๋ธ๋ก์ด ์ด๋ฏธ ์ด๋ค ๋ธ๋ก๊ทธ๋ฃน์ ํฌํจ๋์ด ์๋์ง๋ฅผ ํ์ํ๊ธฐ ์ํด
visited[20][20] ๋ฐฐ์ด์ ๋ง๋ค์ด์ ์์ ๋ธ๋ก๊ทธ๋ฃน์ด ์๋์ง๋ฅผ ์ฒดํฌํ๋ค.
์ด๋ ๋ฌด์ง๊ฐ ๋ธ๋ก์ ๋ชจ๋ ๊ทธ๋ฃน์ ํฌํจ๋ ์ ์์ผ๋ฏ๋ก ํ์ ์ ๋ฌด์ง๊ฐ ๋ธ๋ก์ visited๋ ํญ์ false ์ฌ์ผํ๋ค.
์ธ์ ํ ๋ธ๋ก๋ผ๋ฆฌ ์๋ก ์ด๋ํ ์ ์์ด์ผ ํ๋ค๋ ์กฐ๊ฑด์ด ์์ผ๋ฏ๋ก BFS๋ฅผ ์ด์ฉํด์ ํ์ํ๋ค. ๊ทธ๋ฆฌ๊ณ ์ธ์ ํ ๋ธ๋ก์ด ๊ฐ์ ์์ด๊ฑฐ๋ ๋ฌด์ง๊ฐ ๋ธ๋ก์ด๋ฉด ๊ฐ์ ๊ทธ๋ฃน์ ๋ธ๋ก์ด๋ผ ํ๋จํ๋ค.
3. ๋ธ๋ก ๊ทธ๋ฃน์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ ๋ฒกํฐ
ํ์ ํ ์ฌ๋ฌ ๋ธ๋ก ๊ทธ๋ฃน์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํด์ผ ์ด๋ค ๋ธ๋ก ๊ทธ๋ฃน์ด ๊ฐ์ฅ ํฐ์ง, ๋ฌด์ง๊ฐ ๋ธ๋ก์ด ๋ช๊ฐ๋ ํฌํจ๋์๋์ง๋ฅผ ํ๋จ ํ ์ ์๋ค.
๊ณผ์ 1๋ฒ์ ๋ณด๋ฉด
1. ํฌ๊ธฐ๊ฐ ๊ฐ์ฅ ํฐ ๋ธ๋ก ๊ทธ๋ฃน์ ์ฐพ๋๋ค.
๊ทธ๋ฌํ ๋ธ๋ก ๊ทธ๋ฃน์ด ์ฌ๋ฌ ๊ฐ๋ผ๋ฉด ํฌํจ๋ ๋ฌด์ง๊ฐ ๋ธ๋ก์ ์๊ฐ ๊ฐ์ฅ ๋ง์ ๋ธ๋ก ๊ทธ๋ฃน,
๊ทธ๋ฌํ ๋ธ๋ก๋ ์ฌ๋ฌ๊ฐ๋ผ๋ฉด ๊ธฐ์ค ๋ธ๋ก์ ํ์ด ๊ฐ์ฅ ํฐ ๊ฒ์,
๊ทธ ๊ฒ๋ ์ฌ๋ฌ๊ฐ์ด๋ฉด ์ด์ด ๊ฐ์ฅ ํฐ ๊ฒ์ ์ฐพ๋๋ค.โ
๋ผ๊ณ ๋์ด์๋ค.
๊ทธ๋ ๋ค๋ฉด ๋ธ๋ก ๊ทธ๋ฃน์ ๋ํ ์ ๋ณด๋ฅผ ์ ์ฅํ ๋ ๋ธ๋ก ๊ทธ๋ฃน์ ํฌ๊ธฐ, ํฌํจ๋ ๋ฌด์ง๊ฐ ๋ธ๋ก์ ์, ๊ธฐ์ค ๋ธ๋ก์ ์ขํ
๋ฅผ ์ ์ฅํ๊ณ ์์ด์ผ ์ง์์ผํ ๋ธ๋ก ๊ทธ๋ฃน์ ์ ์ ํ ์ ์๋ค.
vector<pair<pair<int,int>,pair<int,int>>> ๋ก ๋ฒกํฐ๋ฅผ ๋ง๋ค์ด์ ์ด ์ธ๊ฐ์ง ์ ๋ณด๋ฅผ ์ ์ฅํ๋ค.
๊ทธ๋ฆฌ๊ณ vector๋ฅผ ๋ด๋ฆผ์ฐจ์์ผ๋ก ์ ๋ ฌํ๋ค๋ฉด ์์ ์กฐ๊ฑด์ ๋ง์กฑํ๋ ๋ธ๋ก๊ทธ๋ฃน์ด 0๋ฒ ์ธ๋ฑ์ค์ ์ฌ ๊ฒ์ด๋ค.
0๋ฒ ์ธ๋ฑ์ค์ ์๋ ๋ธ๋ก๊ทธ๋ฃน์ ๊ธฐ์ค ๋ธ๋ก์ ์ขํ๋ฅผ ์ด์ฉํด์ ํด๋น ๊ทธ๋ฃน์ ๋ธ๋ก๋ค์ ๋ชจ๋ ์ง์ด๋ค.
๋๋ ๋ธ๋ก ์์ด -2์ด๋ฉด ์๋ ๋ธ๋ก์ด๋ผ๊ณ ์๊ฐํ๋ค.
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
|
#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 <deque>
#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 = 20 + 5;
int N, M;
int dx[] = {-1,0,1,0};
int dy[] = {0,1,0,-1};
int A[MAX_N][MAX_N];
bool visited[MAX_N][MAX_N];
int Score;
vector<pair<pair<int, int>, pair<int, int>>> Block_Group;
void Find_Group(pair<int,int>);
bool is_ok(pair<int, int> now);
void Erase_Group();
void Gravity();
void Rotate();
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> N >> M;
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
cin >> A[i][j];
}
}
while (true) {
memset(visited, false, sizeof(visited));
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
if (!visited[i][j] && A[i][j] > 0) {
Find_Group({ i,j });
}
}
}
if (Block_Group.empty())
break;
sort(Block_Group.begin(), Block_Group.end(), greater<pair<pair<int, int>, pair<int, int>>>());
if (Block_Group[0].first.first < 2)
break;
Erase_Group();
Gravity();
Rotate();
Gravity();
}
cout << Score << "\n";
return 0;
}
void Find_Group(pair<int, int> st) {
queue<pair<int, int>> q;
q.push(st);
int Color = A[st.first][st.second];
pair<int, int> Criterion = st;
int cnt_B = 0;
vector<pair<int, int>> Rainbow;
while (!q.empty()) {
pair<int, int> now = q.front();
q.pop();
if (visited[now.first][now.second])
continue;
visited[now.first][now.second] = true;
cnt_B++;
if (A[now.first][now.second] != 0) {
if (Criterion.first > now.first)
Criterion = now;
else if (Criterion.first == now.first)
Criterion.second = min(Criterion.second, now.second);
}
else Rainbow.push_back(now);
for (int i = 0; i < 4; i++) {
pair<int, int> next = { now.first + dy[i], now.second + dx[i] };
int next_color = A[next.first][next.second];
if (is_ok(next))
if (Color == next_color || next_color == 0)
q.push(next);
}
}
Block_Group.push_back({ {cnt_B, Rainbow.size()},Criterion});
for (int i = 0; i < Rainbow.size(); i++)
visited[Rainbow[i].first][Rainbow[i].second] = false;
Rainbow.clear();
}
void Erase_Group() {
memset(visited, false, sizeof(visited));
pair<int, int> st = Block_Group[0].second;
queue<pair<int, int>> q;
q.push(st);
int color = A[st.first][st.second];
while (!q.empty()) {
pair<int, int> now = q.front();
q.pop();
if (visited[now.first][now.second])
continue;
visited[now.first][now.second] = true;
A[now.first][now.second] = -2;
for (int i = 0; i < 4; i++) {
pair<int, int> next = { now.first + dy[i], now.second + dx[i] };
int next_color = A[next.first][next.second];
if (next_color < 0)
continue;
if (is_ok(next)) {
if (color == next_color || next_color == 0)
q.push(next);
}
}
}
Score += (int)pow(Block_Group[0].first.first, 2);
Block_Group.clear();
}
bool is_ok(pair<int, int> now) {
if (now.first < 1 || now.first > N || now.second < 1 || now.second > N)
return false;
return true;
}
void Gravity() {
for (int i = 1; i <= N; i++) {
for (int j = N; j >= 1; j--) {
if (A[j][i] < 0)
continue;
pair<int, int> to = { j, i};
while (true) {
pair<int, int> next = { to.first + 1, to.second };
if (is_ok(next) && A[next.first][next.second] == -2)
to = next;
else break;
}
if (to.first == j && to.second == i)
continue;
A[to.first][to.second] = A[j][i];
A[j][i] = -2;
}
}
}
void Rotate() {
int temp[MAX_N][MAX_N];
for (int i = 1; i <= N; i++)
for (int j = 1; j <= N; j++)
temp[i][j] = A[i][j];
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
A[N + 1 - j][i] = temp[i][j];
}
}
}
|
cs |
'๋ฐฑ์ค > Gold' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 21611 : ๋ง๋ฒ์ฌ ์์ด์ ๋ธ๋ฆฌ์๋ (0) | 2022.06.03 |
---|---|
[BOJ] 21610 : ๋ง๋ฒ์ฌ ์์ด์ ๋น๋ฐ๋ผ๊ธฐ (0) | 2022.06.02 |
[BOJ] 21608 : ์์ด ์ด๋ฑํ๊ต (0) | 2022.05.31 |
[BOJ] 20058 : ๋ง๋ฒ์ฌ ์์ด์ ํ์ด์ด์คํฐ (0) | 2022.05.31 |
[BOJ] 20057 : ๋ง๋ฒ์ฌ ์์ด์ ํ ๋ค์ด๋ (0) | 2022.05.30 |