๋ฌธ์ ๋งํฌ
3197๋ฒ: ๋ฐฑ์กฐ์ ํธ์ (acmicpc.net)
๋นํ์ ๋งํ ์๋ก ๋ง๋ ์ ์๋ ๋ ๋ฐฑ์กฐ๊ฐ ๋นํ์ด ๋ น์ ๋ง๋๊ธฐ ์ํด์ ๋ฉฐ์น ์ด ๊ฑธ๋ฆฌ๋์ง ์ถ๋ ฅํ๋ ๋ฌธ์ .
'.'์ ๋ฌผ, 'X'๋ ๋นํ 'L'์ ๋ฐฑ์กฐ๋ฅผ ๋ํ๋ธ๋ค.
๋ฌผ๊ณผ ์ธ์ ํ ๋นํ์ ํ๋ฃจ์ ๊ฑธ์ณ ๋ น๋๋ค.
ํ์ด
์ฒ์์ ๋ฌธ์ ๋ฅผ ์ ๋๋ก ์ ์ฝ์ด์ ๋ ๋ฐฑ์กฐ๊ฐ ์ต๋จ๊ฑฐ๋ฆฌ๋ก ๋ง๋๊ธฐ ์ํด ํ์ํ ๋ ์ ์ถ๋ ฅํ๋ ๊ฒ์ธ ์ค ์์๋ค. ๊ทธ๋์ ํ์ฐธ์ ํ๊ณ ์ํ๋ค๊ฐ ์๊ณ ๋ฆฌ์ฆ ๋ถ๋ฅ๊ฐ ๋ค์ต์คํธ๋ผ๊ฐ ์๋ ๊ฒ์ ๋ณด๊ณ ๋ฌธ์ ๋ฅผ ๋ค์ ์ฝ์๋ค ใ ใ .
์ด ๋ฌธ์ ๋ ์ต๋จ ๊ฑฐ๋ฆฌ๊ฐ ์๋ ๋ ๋ฐฑ์กฐ๊ฐ ์๋ก ๋ง๋ ์ ์๊ธฐ๋ง ํ๋ฉด ๋๋ค. Union-Find๋ฅผ ์ด์ฉํด์ ๋ ๋ฐฑ์กฐ๊ฐ ๊ฐ์ ์งํฉ์์ ์๋ค๋ฉด ๋ ๋ฐฑ์กฐ๋ ๋ง๋ ์ ์๋ ๊ฒ์ผ๋ก ์๊ฐํ๋ค
1. ์ ๋ ฅ๋ฐ์ ๋, ์ ๋ ฅ์ด L์ด๋ฉด ๋ฐฑ์กฐ์ด๋ฏ๋ก ๊ทธ ์์น๋ฅผ L1, L2์ ๊ฐ๊ฐ ์ ์ฅํ๋ค. ๋ํ ์ ๋ ฅ์ด ๋ฌผ( . )์ด๋ฉด ํ์ ๊ทธ ์ขํ๋ฅผ ๋ฃ๋๋ค. ์ ๋ ฅ์ด ๋นํ( X )์ด๋ฉด ๋ฐ๋ก ์ฒ๋ฆฌํ ๊ฑด ์๋ค.
๋๋ water๋ผ๋ ํ๋ฅผ ๋ง๋ค์ด์ ๋ฌผ์ ์ขํ๋ฅผ ์ ์ฅํ๋ค.
โป ์ฃผ์ํด์ผํ ์
์ฒ์ ์ ๋ ฅ์ ์ ๋ ฅ๋ฐ์ ๋ ๋ฐฑ์กฐ๊ฐ ์๋ ๊ณต๊ฐ๋ ๋ฌผ์ด๋ฏ๋ก ๋ฐฑ์กฐ๊ฐ ์๋ ์ขํ๋ water ํ์ ์ง์ด ๋ฃ์ด์ค๋ค.
2. water์ ์ ์ฅ๋ ์ขํ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก BFS๋ก ์ํ์ข์ฐ๋ฅผ ํ์ํ๋ค. ๋ง์ฝ ์ธ์ ํ ๋ถ๋ถ์ด ๋ฌผ์ด๋ฉด ๋ฌผ๋ผ๋ฆฌ๋ ์ด์ด์ ธ์ผํ๋ฏ๋ก Union์ ํตํด ๊ฒฐํฉํ๋ค. ์ธ์ ํ ๋ถ๋ถ์ด ๋นํ์ด๋ฉด ์ด ๋ถ๋ถ์ ๋ฌผ๋ก ๋ง๋ค๊ณ Union์ ํตํด ๊ฒฐํฉํ๋ค. ๊ทธ๋ฆฌ๊ณ ๋นํ์์ ๋ฌผ๋ก ๋ฐ๋์์ผ๋ฏ๋ก ๊ทธ ์ขํ๋ water ํ์ ์๋ก์ด ๊ฐ์ผ๋ก ๋ฃ๋๋ค.
3. ์ํ์ข์ฐ ๋ชจ๋ Union ํ ํ ๋ง์ฝ L1(๋ฐฑ์กฐ1) ๊ณผ L2(๋ฐฑ์กฐ2)๊ฐ ๊ฐ์ ์งํฉ์ ์๋ค๋ฉด, ์ฆ Parent๊ฐ ๊ฐ๋ค๋ฉด ๋ฌผ๊ธธ์ด ์ด์ด์ง ๊ฒ์ด๋ฏ๋ก ๊ทธ๋๊น์ง ๊ฑธ๋ฆฐ ๋ ์ ์ถ๋ ฅํ๋ค.
๋ด๊ฐ ๋ง๋ ๋ฐ๋ก
1 17
LXX.XXL
์ ๋ ฅ์ด ์ด๋ ๊ฒ ์ฃผ์ด์ก์ ๋, ๋ด๊ฐ ์๊ฐํ ์๊ณ ๋ฆฌ์ฆ ๋๋ก๋ผ๋ฉด water ํ์๋ L, . , L์ ์ขํ๊ฐ ๋ค์ด๊ฐ๊ฒ ๋๊ณ
1์ผ์ฐจ์ L....L ์ด ๋๋ฏ๋ก ๋ต์ 1์ด๋ค. ๊ทธ๋ฐ๋ฐ ์ฒ์ ๋ด๊ฐ ์ง ์ฝ๋๋ 1์ผ์ฐจ ํ {'L' , '.'}, {'.' , '.' , '.'}, {'.' , 'L'} ์ด๋ ๊ฒ ์ธ ์งํฉ์ผ๋ก ๋๋ ์ ธ L1๊ณผ L2๊ฐ ๊ฐ์ ์งํฉ ์์ ์๋ ๊ฒ์ผ๋ก ํ์ ๋๊ณ 2์ผ์ฐจ์ ๋ชจ๋ ๊ฐ์ ์งํฉ์ ๋ค์ด๊ฐ๊ฒ ๋ผ์ 2๋ฅผ ์ถ๋ ฅํ๊ณ ์์๋ค.
์ธ์ ํ ๋ถ๋ถ์ด 'X'(๋นํ)์ผ ๊ฒฝ์ฐ 'X'(๋นํ)๋ฅผ '.'(๋ฌผ) ์ผ๋ก ๋ฐ๊พธ๊ณ , ๋ค์ ์ด ๊ณต๊ฐ(๋นํ์ด์๋ ๋ถ๋ถ)๊ณผ ์ธ์ ํ ๋ถ๋ถ์ด ๋ฌผ์ด๋ผ๋ฉด Union์ ํด์ฃผ์ด์ผ ํ๋ค.
๊ทธ ๋ถ๋ถ์ด ์ด ์ฝ๋์ ๋ค์ด์๋ค.
if (is_ok(next)) {
if (Map[next.first][next.second] == 'X') { // ๋ฌผ๋ก ๋ง๋ค์ด์ผํจ
Map[next.first][next.second] = '.';
Union(now, next);
for (int j = 0; j < 4; j++) {
pair<int, int> next_next = { next.first + dy[i], next.second + dx[i] };
if (is_ok(next_next)) {
if (Map[next_next.first][next_next.second] == '.') {
if (Find(next) != Find(next_next))
Union(next, next_next);
}
}
}
water.push({ next, day + 1 });
}
}โ
์ข ํฉํด์ ์ฝ๋๋ฅผ ์ง๋ณด๋ฉด
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
|
#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 1000000007
using namespace std;
typedef long long ll;
typedef priority_queue<pair<pair<int, int>, int>, vector<pair<pair<int, int>, int>>, greater<pair<pair<int, int>, int>>> Priority_queue;
const int INF = INT_MAX;
const int MAX_N = 1500 + 5;
char Map[MAX_N][MAX_N];
int R, C;
queue<pair<pair<int, int>, int>> water;
int dx[] = { 0,1,0,-1 };
int dy[] = { 1,0,-1,0 };
pair<int, int> Trace[MAX_N][MAX_N];
pair<int, int> Parent[MAX_N][MAX_N];
pair<int, int> Find(pair<int, int> X) {
if (Parent[X.first][X.second] == X)
return X;
return Parent[X.first][X.second] = Find(Parent[X.first][X.second]);
}
void Union(pair<int, int> X, pair<int, int> Y) {
pair<int, int> parent_x = Find(X);
pair<int, int>parent_y = Find(Y);
Parent[parent_y.first][parent_y.second] = parent_x;
}
bool is_ok(pair<int, int>);
int main(void) {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cin >> R >> C;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
Parent[i][j] = { i,j };
}
}
pair<int, int> L1, L2;
bool chk = false;
for (int i = 0; i < R; i++) {
for (int j = 0; j < C; j++) {
cin >> Map[i][j];
if (Map[i][j] == '.')
water.push({ { i,j }, 0 });
else if (Map[i][j] == 'L' && !chk) {
L1 = { i,j };
water.push({ { i,j }, 0 });
chk = true;
}
else if (Map[i][j] == 'L' && chk) {
water.push({ { i,j }, 0 });
L2 = { i,j };
}
}
}
while (!water.empty()) {
pair<int, int> now = water.front().first;
int day = water.front().second;
water.pop();
for (int i = 0; i < 4; i++) {
pair<int, int> next = { now.first + dy[i], now.second + dx[i] };
if (is_ok(next)) {
if (Map[next.first][next.second] == 'X') { // ๋ฌผ๋ก ๋ง๋ค์ด์ผํจ
Map[next.first][next.second] = '.';
Union(now, next);
for (int j = 0; j < 4; j++) {
pair<int, int> next_next = { next.first + dy[i], next.second + dx[i] };
if (is_ok(next_next)) {
if (Map[next_next.first][next_next.second] == '.') {
if (Find(next) != Find(next_next))
Union(next, next_next);
}
}
}
water.push({ next, day + 1 });
}
else if (Map[next.first][next.second] == '.') {
if (Find(now) != Find(next))
Union(now, next);
}
}
}
if (Find(L1) == Find(L2)) { //์ธ์ ํ ๋ถ๋ถ์ ๋ค ๋
น์ธ ํ, L1๊ณผ L2๊ฐ ๊ฐ์ ์งํฉ์ ์๋ค๋ฉด
cout << day + 1 << "\n";
break;
}
}
return 0;
}
bool is_ok(pair<int, int> now) {
if (now.first < 0 || now.first >= R || now.second < 0 || now.second >= C)
return false;
return true;
}
|
cs |
'๋ฐฑ์ค > Platinum' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ] 13308 : ์ฃผ์ ์ (0) | 2022.03.15 |
---|---|
[BOJ] 10272 : ํ์๊ธ ์ฌ๋ฅ๊พผ ๊น์ ์ (0) | 2022.03.11 |
[BOJ] 2842 : ์ง๋ฐฐ์ ํ์๋ (0) | 2022.03.10 |
[BOJ] 1328 : ๊ณ ์ธต ๋น๋ฉ (0) | 2022.03.07 |
[BOJ] 5719 : ๊ฑฐ์ ์ต๋จ ๊ฒฝ๋ก (0) | 2022.01.27 |