๋ฌธ์ ๋งํฌ
21611๋ฒ: ๋ง๋ฒ์ฌ ์์ด์ ๋ธ๋ฆฌ์๋ (acmicpc.net)
๋ง๋ฒ์ฌ ์์ด ์๋ฆฌ์ฆ ไธญ ๋ธ๋ฆฌ์๋ ํธ.
์ฌํ ํ์๋ ๋ง๋ฒ์ฌ ์์ด ๋ฌธ์ ์ค์ ์ ์ผ ๊น๋ค๋ก์ ๋ ๋ฌธ์ ์ธ ๊ฒ ๊ฐ๋ค.
ํ์ด
๋ง๋ฒ์ฌ ์์ด๋ "๋ธ๋ผ์๋"๋ผ๋ ์๋ก์ด ๋ง๋ฒ์ ๋ฐฐ์ ๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๊ฒ์ N x N ๊ฒฉ์ํ์์ ์ฐ์ต์ค์ด๋ค.
๊ฒฉ์ํ์ ํฌ๊ธฐ๋ ํญ์ ํ์์ด๋ฉฐ ์์ด๋ ์ฒ์์ ((N+1)/2, (N+1)/2)์ ์๋ค. ์ฆ ๊ฒฉ์ํ์ ํ๊ฐ์ด๋ฐ์ ์๋ค๋ ์๋ฏธ์ด๋ค.
๊ฒฉ์์์ ์ค์ ์ ๋ฒฝ์ ์๋ฏธํ๊ณ ์ ์ ์ฌ์ด๋ ์ง๋๋ค๋ ์ ์๋ค.
ํฌ๊ธฐ๊ฐ 5์ธ (N = 5) ๊ฒฉ์ํ์ ์์๋ก ๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ์ด ๊ฒฉ์ํ์ ๋ฒํธ๊ฐ ์ ํด์ง๋ค. ์์ด์ ์ข์ธก์ ์์์ผ๋ก ๋น๊ธ๋น๊ธ ๋์๊ฐ๋ฉด์ ๋ฒํธ๊ฐ ์ ์ ๋๋ค.
๋ฒํธ ๋ฐฐ์น๊ฐ ์ด๋ ๊ฒ ๋ผ์์ด์ ๊ตฌํ์ด ๋ณต์กํ๋ ๊ฒ ๊ฐ๋ค.
์์์ ๊ฒฉ์ ์นธ์ ์ ํํ์ ๋, ๋ค์ ๋ฒํธ ์นธ์ด ์ด๋์ธ์ง๋ฅผ ๋ฐ๋ก ์ฐพ๊ธฐ๊ฐ ์ฝ์ง ์๋ค. ๊ทธ๋์ ๋๋ ์ฒ์์ N์ ์ ๋ ฅ๋ฐ์ ํ์ ๊ฒฉ์ ์นธ์ ์ ํด์ง ์์๋๋ก ๋๋ฉด์ Next๋ผ๋ 2์ฐจ์ pair<int,int> ๋ฐฐ์ด์ ๋ค์์นธ์ ์ธ๋ฑ์ค๋ฅผ ์ ์ฅํด๋์๋ค.
์ด๋ ๊ฒ ํ๋ฉด ์์์ ์นธ (r,c) ์ ๋ํด์ ๋ค์ ์นธ์ ์ธ๋ฑ์ค๊ฐ ์ด๋์ธ์ง ๋ฐ๋ก ์ ์ ์๋ค.
๊ทธ๋ฆฌ๊ณ ๋น์นธ์ด ์๊ธฐ๋ฉด ๋ฒํธ๊ฐ ์์ ์นธ์ผ๋ก ๊ตด๋ฌ๊ฐ๊ธฐ ๋๋ฌธ์ ์์์ ์นธ์ ๋ํด ์ด์ ๋ฒํธ ์นธ์ด ์ด๋์ธ์ง๋ ์์์ผํ๋ค.
๊ทธ๋์ Before๋ผ๋ 2์ฐจ์ pair<int,int> ๋ฐฐ์ด๋ ์ ์ธํด์ ์ด์ ์นธ์ ์ธ๋ฑ์ค๋ ์ ์ฅํ๋ค.
์์ด์ ๋ช ๋ น ์ดํ์ ๊ตฌ์ฌ์ ์งํ์ ๋ณด๋ฉด
๋ธ๋ฆฌ์๋ -> ๊ตฌ์ฌ ์ฌ๋ฐฐ์ด -> ํญ๋ฐ -> ์ฌ๋ฐฐ์ด -> ๋ณํ ์์ผ๋ก ๋ฐ์ํ๊ณ , ํญ๋ฐ ๊ณผ์ ์ ํญ๋ฐํ ๊ตฌ์ฌ์ด ์์ ๋๊น์ง ๊ณ์ํด์ ๋ฐ์ํ๋ค.
์์ ๊ณผ์ ์ ๊ตฌํํ๊ธฐ ์ํด์ ์ด๋ค ์ ๋ณด๋ค์ด ํ์ํ ๊น??
1. ํ์ฌ ๊ฒฉ์ํ์ ์ํฉ
๊ฐ ์นธ๋ง๋ค ํ์ฌ ๊ตฌ์ฌ์ด ๋ค์ด์๋์ง, ๋น์ด์๋์ง ๊ทธ๋ฆฌ๊ณ ๋ค์ด์๋ค๋ฉด ์ด๋ค ๊ตฌ์ฌ์ด ๋ค์ด์๋ ์ง๋ฅผ ํญ์ ํ์ ํ๊ณ ์์ด์ผํ๋ค. ๊ทธ๋ฆฌ๊ณ ๊ณผ์ ์ด ์งํ๋จ์ ๋ฐ๋ผ ๊ฒฉ์ํ์ ์์ ํด์ฃผ์ด์ผ ํ๋ค.
A[50][50] ์ ์ ์ ๋ฐฐ์ด์ ๋ง๋ค์ด์ ๊ฒฉ์ํ์ ์ํฉ์ ์ ์ฅํ๋ค.
2. ์์ ๋งํ๋ ๊ฐ ์นธ๋ค์ ๋ค์์นธ๊ณผ ์ด์ ์นธ์ ์๋ ค์ฃผ๋ Next, Before ๋ฐฐ์ด
3. ๋ฐฉํฅ ๋ฐฐ์ด
pair<int, int> Dir[] = { {0,0}, {-1,0}, {1,0}, {0,-1}, {0,1} };
๋ฐฉํฅ์ 1๋ฒ~4๋ฒ 4๊ฐ์ง๊ฐ ์์ผ๋ฏ๋ก 0๋ฒ ์ธ๋ฑ์ค์๋ ํธ์๋ฅผ ์ํด ์์์ ๊ฐ์ ๋ฃ์ด๋์๋ค.
ํ์ํ ์ ๋ณด๋ค์ ์ด์ ๋๊ฐ ๋ ๊ฒ ๊ฐ๋ค.
- Next, Before ๋ฐฐ์ด ๊ฐ ๋์
๋ฌธ์ ์์ ์ฃผ์ด์ง ๊ฒฉ์ํ์ ๋ฒํธ๋ฅผ ์ ๋ค์ฌ๋ค๋ณด์.
์์ด์ ์ผ์ชฝ ๋๊ฐ์ ์ธ 2๋ฒ๋ถํฐ ์ค๋ฅธ์ชฝ์ผ๋ก ์ถ๋ฐํด์ 2,2,3,3,4,4,5,5,6,6,.. ์นธ์ ์ด๋ํ ๋๋ง๋ค ๋ฐฉํฅ์ด ์ ํ๋๋ค๋ ๊ท์น์ด ์๋ค. ์ด ๊ท์น์ ์ด์ฉํด์ Next๋ฐฐ์ด๊ณผ Before ๋ฐฐ์ด์ ๊ฐ์ ์ง์ ํด์ค๋ค.
- ๋ธ๋ฆฌ์๋ ๋ง๋ฒ
๋ธ๋ฆฌ์๋๋ ๊ตฌํ์ด ์ฝ๋ค. d ๋ฐฉํฅ์ผ๋ก ์์ด์์ s๋งํผ ๋จ์ด์ง ์นธ๊น์ง ์ผ์๋ก ๊ตฌ์ฌ์ ํ๊ดด์ํค๋ฉด ๋๋ค.
ํ๊ดด๋ ๊ตฌ์ฌ์ A๋ฐฐ์ด์์ ๊ฐ์ 0์ผ๋ก ๋ณ๊ฒฝ์์ผ์ฃผ๋ฉด ๋๋ค.
- ์ฌ๋ฐฐ์ด
๋ฒํธ๊ฐ ์์ ์นธ๋ถํฐ ํฐ ์นธ์ผ๋ก ์ด๋ํ๋ฉด์ ํด๋น ์นธ์ ๊ตฌ์ฌ์ด ์๋ค๋ฉด ๊ทธ ๊ตฌ์ฌ์ ๋น์นธ์ด ์์ ๋ ๊น์ง ๋ก๊ฒจ์ฃผ๋ฉด ๋๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ ๊ตฌ์ฌ์ด ์๋ ์นธ์ ๋น ์นธ์ด ๋๋ค.
- ํญ๋ฐ
1๋ฒ ์นธ๋ถํฐ ๋ง์ง๋ง ์นธ๊น์ง ๋๋ฉด์ ๋ฒํธ๊ฐ ๊ฐ์ ๊ตฌ์ฌ๋ค์ด ๋ถ์ด์์ผ๋ฉด ๋ชจ๋ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ด์ค๋ค. ๊ทธ๋ฆฌ๊ณ ๊ทธ๋ฃน์ ํฌ๊ธฐ๊ฐ 4์ด์์ด๋ผ๋ฉด ํด๋น ๊ทธ๋ฃน์ ๊ตฌ์ฌ๋ค์ ํญ๋ฐ์ํจ๋ค.
์ด๋ (ํ๊ดด๋ ๊ตฌ์ฌ์ ๋ฒํธ * ๊ตฌ์ฌ์ ์) ์ ์ดํฉ์ด ์ฐ๋ฆฌ๊ฐ ์ถ๋ ฅํด์ผํ ์ ๋ต์ด๋ค.
ํญ๋ฐ -> ์ฌ๋ฐฐ์ด ๊ณผ์ ์ ํญ๋ฐํ ๊ตฌ์ฌ์ด ์์ ๋๊น์ง ๋ฐ๋ณตํ๋ค.
- ๋ณํ
๋ณํ ๊ณผ์ ์ญ์ 1๋ฒ ์นธ๋ถํฐ ๋ง์ง๋ง ์นธ๊น์ง ๋๋ฉด์ ๋ฒํธ๊ฐ ๊ฐ์ ๊ตฌ์ฌ๋ค์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ๊ณ , ๊ทธ๋ฃน์ ๋ค์ด์๋ ๊ตฌ์ฌ์ ๋ฒํธ์ ๊ตฌ์ฌ์ ์๋ฅผ ์์์ ๋ฒกํฐ์ ์ ์ฅํด๋๋ค. ์ด๋ ๊ทธ๋ฃน์ ํฌ๊ธฐ๋ ์๊ด์๋ค.
๋ชจ๋ ๊ตฌ์ฌ๋ค์ ๊ทธ๋ฃน์ผ๋ก ๋ฌถ์ ํ, ์์์ ๋ฒกํฐ์ ๋ค์ด์๋ ์ ๋ณด๋ฅผ ์ด์ฉํด์ ๊ฒฉ์ ์นธ์ ๊ตฌ์ฌ๋ค์ ๋ณํ์์ผ์ค๋ค.
|
#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 = 50 + 5;
int N, M;
pair<int, int> Dir[] = { {0,0}, {-1,0}, {1,0}, {0,-1}, {0,1} };
int dx[] = { 0,1,0,-1 };
int dy[] = { 1,0,-1,0 };
int A[MAX_N][MAX_N];
pair<int, int> Shark;
pair<int, int> Next[MAX_N][MAX_N];
pair<int, int> Before[MAX_N][MAX_N];
int Score;
void Blizzard(int, int);
void Init();
void Arrange();
bool Explode();
void Change();
void Print_A() {
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++)
cout << A[i][j] << " ";
cout << "\n";
}
cout << "\n";
}
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> N >> M;
Init();
for (int i = 1; i <= N; i++) {
for (int j = 1; j <= N; j++) {
cin >> A[i][j];
}
}
for (int i = 0; i < M; i++) {
int d, s;
cin >> d >> s;
Blizzard(d, s);
Arrange();
while(Explode()) Arrange();
Change();
}
cout << Score << "\n";
return 0;
}
void Init() {
Shark = { (1 + N) / 2, (1 + N) / 2 };
pair<int, int> now = { Shark.first + 1, Shark.second - 1 };
Next[Shark.first][Shark.second - 1] = now;
Before[Shark.first][Shark.second - 1] = {-1,-1};
Before[now.first][now.second] = { Shark.first, Shark.second - 1 };
int direct = 1;
for (int i = 2; i <= N; i++) {
for (int k = 1; k <= 2; k++) {
for (int j = 1; j <= i; j++) {
pair<int, int> next = { now.first + dy[direct], now.second + dx[direct] };
Next[now.first][now.second] = next;
Before[next.first][next.second] = now;
now = next;
if (now.first == 1 && now.second == 1)
break;
}
if (now.first == 1 && now.second == 1)
break;
direct++;
direct %= 4;
}
if (now.first == 1 && now.second == 1)
break;
}
Next[1][1] = { -1,-1 };
}
void Blizzard(int d, int s) {
for (int i = 1; i <= min((int)(N/2),s); i++) {
pair<int, int> next = { Shark.first + Dir[d].first * i, Shark.second + Dir[d].second * i };
A[next.first][next.second] = 0;
}
}
void Arrange() {
pair<int, int> now = { Shark.first + 1, Shark.second - 1 };
while(true){
if (now.first == -1 && now.second == -1)
break;
if (A[now.first][now.second] == 0) {
now = Next[now.first][now.second];
continue;
}
pair<int, int> to = now;
while (true) {
pair<int, int> before = Before[to.first][to.second];
if (before.first == -1 && before.second == -1)
break;
if (A[before.first][before.second] == 0)
to = before;
else break;
}
if (to.first == now.first && to.second == now.second) {
now = Next[now.first][now.second];
continue;
}
A[to.first][to.second] = A[now.first][now.second];
A[now.first][now.second] = 0;
}
}
bool Explode() {
pair<int,int> now = { Shark.first, Shark.second - 1 };
vector<pair<int, int>> group;
bool chk = false;
for (int i = 1; i <= N * N - 1; i++) {
if (A[now.first][now.second] == 0)
break;
pair<int, int> next = Next[now.first][now.second];
if (A[now.first][now.second] == A[next.first][next.second]) {
group.push_back(now);
now = next;
continue;
}
else {
group.push_back(now);
if (group.size() >= 4) {
Score += A[now.first][now.second] * group.size();
for (int j = 0; j < group.size(); j++) {
A[group[j].first][group[j].second] = 0;
}
chk = true;
}
now = next;
group.clear();
}
}
return chk;
}
void Change() {
vector<pair<int, int>> Group;
pair<int, int> now = { Shark.first, Shark.second - 1 };
int cnt = 1;
for (int i = 1; i <= N * N - 1; i++) {
if (A[now.first][now.second] == 0)
break;
pair<int, int> next = Next[now.first][now.second];
if (A[now.first][now.second] == A[next.first][next.second])
cnt++;
else{
Group.push_back({ cnt,A[now.first][now.second] });
cnt = 1;
}
now = next;
}
memset(A, 0, sizeof(A));
now = { Shark.first, Shark.second - 1 };
for (int i = 0; i < Group.size(); i++) {
A[now.first][now.second] = Group[i].first;
pair<int, int> next = Next[now.first][now.second];
if (next.first == -1)
break;
A[next.first][next.second] = Group[i].second;
now = Next[next.first][next.second];
if (now.first == -1)
break;
}
}
|
cs |
์ฝ๋์ ๊ธธ์ด๊ฐ ๊ฝค ๊ธธ์ด์ก๋ค
์ฝ๋ฉ ํ ์คํธ์ ์ด ์ ๋ ๊ตฌํ๋ฌธ์ ๊ฐ ๋์ค๋ฉด ์๊ฐ์ด ์ค๋๊ฑธ๋ ค๋ ํ์ด์ผํ ๊น ๋๊ฒจ์ผํ ๊น,,
'๋ฐฑ์ค > Gold' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 23288 : ์ฃผ์ฌ์ ๊ตด๋ฆฌ๊ธฐ (0) | 2022.06.03 |
---|---|
[BOJ] 21610 : ๋ง๋ฒ์ฌ ์์ด์ ๋น๋ฐ๋ผ๊ธฐ (0) | 2022.06.02 |
[BOJ] 21609 : ์์ด ์คํ๊ต (0) | 2022.06.02 |
[BOJ] 21608 : ์์ด ์ด๋ฑํ๊ต (0) | 2022.05.31 |
[BOJ] 20058 : ๋ง๋ฒ์ฌ ์์ด์ ํ์ด์ด์คํฐ (0) | 2022.05.31 |