๋ฌธ์
๋ ๋ง๋ฆฌ์ ๋ฐฑ์กฐ๊ฐ ํธ์์์ ์ด๊ณ ์์๋ค. ๊ทธ๋ ์ง๋ง ๋ ๋ง๋ฆฌ๋ ํธ์๋ฅผ ๋ฎ๊ณ ์๋ ๋นํ์ผ๋ก ๋ง๋์ง ๋ชปํ๋ค.
ํธ์๋ ํ์ด R๊ฐ, ์ด์ด C๊ฐ์ธ ์ง์ฌ๊ฐํ ๋ชจ์์ด๋ค. ์ด๋ค ์นธ์ ์ผ์์ผ๋ก ๋ฎ์ฌ์๋ค.
ํธ์๋ ์ฐจ๋ก๋ก ๋
น๋๋ฐ, ๋งค์ผ ๋ฌผ ๊ณต๊ฐ๊ณผ ์ ์ดํ ๋ชจ๋ ๋นํ ๊ณต๊ฐ์ ๋
น๋๋ค. ๋ ๊ฐ์ ๊ณต๊ฐ์ด ์ ์ดํ๋ ค๋ฉด ๊ฐ๋ก๋ ์ธ๋ก๋ก ๋ฟ์ ์๋ ๊ฒ๋ง (๋๊ฐ์ ์ ๊ณ ๋ คํ์ง ์๋๋ค) ์๊ฐํ๋ค.
์๋์๋ ์ธ ๊ฐ์ง ์๊ฐ ์๋ค.
๋ฐฑ์กฐ๋ ์ค์ง ๋ฌผ ๊ณต๊ฐ์์ ์ธ๋ก๋ ๊ฐ๋ก๋ก๋ง(๋๊ฐ์ ์ ์ ์ธํ๋ค) ์์ง์ผ ์ ์๋ค.
๋ฉฐ์น ์ด ์ง๋์ผ ๋ฐฑ์กฐ๋ค์ด ๋ง๋ ์ ์๋ ์ง ๊ณ์ฐํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์
๋ ฅ์ ์ฒซ์งธ ์ค์๋ R๊ณผ C๊ฐ ์ฃผ์ด์ง๋ค. ๋จ, 1 ≤ R, C ≤ 1500.
๋ค์ R๊ฐ์ ์ค์๋ ๊ฐ๊ฐ ๊ธธ์ด C์ ๋ฌธ์์ด์ด ํ๋์ฉ ์ฃผ์ด์ง๋ค. '.'์ ๋ฌผ ๊ณต๊ฐ, 'X'๋ ๋นํ ๊ณต๊ฐ, 'L'์ ๋ฐฑ์กฐ๊ฐ ์๋ ๊ณต๊ฐ์ผ๋ก ๋ํ๋ธ๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ ๋ฌธ์ ์์ ์ฃผ์ด์ง ๊ฑธ๋ฆฌ๋ ๋ ์ ์ถ๋ ฅํ๋ค.
ํ์ด
"๋ฐฑ์กฐ BFS -> ๋ฌผ BFS"
์ด ๊ณผ์ ์ ๋ฐ๋ณตํ๋ฉด ๋๋ ๋ฌธ์
๋งค์ผ BFS๋ฅผ ๋๋ฒ์ฉ ํด์ผํ๋ค.
์ด๋ bfs ์์์ ์ ๋งค๋ฒ ์ด์ค ๋ฐ๋ณต๋ฌธ์ผ๋ก ๊ตฌํ๋ คํ๋ฉด ๋ฐ๋ก 2%์์ ์๊ฐ์ด๊ณผ๊ฐ ๋ฌ๋ค.
bfs๋ฅผ ํ ๋ ๋ด์ผ์ ์์์ ์ด ๋ ํ๋ณด๋ค์ ๋ฏธ๋ฆฌ ํ์ ๋ฃ์ด๋๊ณ , ๊ทธ ๋ค์๋ ์ด ํ๋ฅผ ์ฌ์ฉํด์ผํ๋ค
1. ๋ฌผ BFS : melt()
// bfs : ๋นํ(X) -> ๋ฌผ(.)
void melt() {
queue<ci>q = water; // ํ์ ์ ์ฅ๋ ๋ฌผ์ ์ขํ๋ค์์ bfs ์์
while(!water.empty()) { // ๋ค์ ๋ฌผ ์ขํ๋ค์ ์ด๊ธฐํ
water.pop();
}
while(!q.empty()) {
ci cur = q.front();
q.pop();
for(int dir=0; dir<4; dir++) {
int x = cur.first + dx[dir];
int y = cur.second + dy[dir];
if(x<0 || x>=r || y<0 || y>=c) continue;
// ๋นํ์ด๋ผ๋ฉด ๋ฌผ๋ก ๋ฐ๊พธ๊ณ ํด๋น ์์น ์ ์ฅ (๋ด์ผ ๋ฌผ์ด ๋จ)
if(v[x][y] == 'X') {
v[x][y] = '.';
water.push({x,y});
}
// ๋นํ์ด ์๋๋ผ๋ฉด(๋ฌผ์ด๋ ๋ฐฑ์กฐ๋ผ๋ฉด) ํจ์ค
}
}
return;
}
2. ๋ฐฑ์กฐ BFS : swim()
// bfs : ๋ฌผ(.) or ๋นํ(X) -> ๋ฐฑ์กฐ(L)
bool swim() {
vector<vector<bool>>visited(r, vector<bool>(c, false)); // ๋ฐฉ๋ฌธ์ฌ๋ถ ํ์
queue<ci>q = swan; // ํ์ ์ ์ฅ๋ ๋ฐฑ์กฐ ์์น์์ bfs ์์
while(!swan.empty()) { // ๋ค์ ํ ์ด๊ธฐํ
swan.pop();
}
while(!q.empty()) {
ci cur = q.front();
q.pop();
for(int dir=0; dir<4; dir++) {
int x = cur.first + dx[dir];
int y = cur.second + dy[dir];
if(x<0 || x>=r || y<0 || y>=c) continue;
if(visited[x][y]) continue;
visited[x][y] = true;
if(goal.first==x && goal.second==y) {
// ๋ค์ ์ขํ๊ฐ ๋ค๋ฅธ ๋ฐฑ์กฐ์ ์์น์ ๊ฐ์ = ๋ฐฑ์กฐ ๋๋ง๋ฆฌ๊ฐ ๋ง๋จ
return true;
} else if(v[x][y] == '.') {
// ๋ค์ ์ขํ๊ฐ ๋ฌผ = ๋ฐฑ์กฐ๊ฐ ์ฐจ์งํจ
v[x][y] = 'L';
q.push({x,y});
} else if(v[x][y] == 'X') {
// ๋ค์ ์ขํ๊ฐ ๋นํ = ๋ ๋ชป๋์๊ฐ = ๋ด์ผ ํ์ฌ ์์น๋ถํฐ ์์ํ๋๋ก ์ขํ ์ ์ฅ
swan.push({cur.first, cur.second});
}
}
}
return false;
}
์ฝ๋
// ํ์ด : https://whkakrkr.tistory.com
#include <bits/stdc++.h>
using namespace std;
typedef pair<int, int> ci;
int dx[] = {0,0,-1,1};
int dy[] = {-1,1,0,0};
int r,c;
vector<string> v;
ci start={-1,-1}, goal;
queue<ci> water, swan;
// bfs : ๋ฌผ(.) or ๋นํ(X) -> ๋ฐฑ์กฐ(L)
bool swim() {
vector<vector<bool>>visited(r, vector<bool>(c, false));
queue<ci>q = swan;
while(!swan.empty()) {
swan.pop();
}
while(!q.empty()) {
ci cur = q.front();
q.pop();
for(int dir=0; dir<4; dir++) {
int x = cur.first + dx[dir];
int y = cur.second + dy[dir];
if(x<0 || x>=r || y<0 || y>=c) continue;
if(visited[x][y]) continue;
visited[x][y] = true;
if(goal.first==x && goal.second==y) { // ๋ฐฑ์กฐ ๋๋ง๋ฆฌ๊ฐ ๋ง๋จ
return true;
} else if(v[x][y] == '.') { // ๋ฌผ๋ก ์ด๋
v[x][y] = 'L';
q.push({x,y});
} else if(v[x][y] == 'X') { // ๋ฌผ์ด ๋ ์ด๋ช
swan.push({cur.first, cur.second});
}
}
}
return false;
}
// bfs : ๋นํ(X) -> ๋ฌผ(.)
void melt() {
queue<ci>q = water;
while(!water.empty()) {
water.pop();
}
while(!q.empty()) {
ci cur = q.front();
q.pop();
for(int dir=0; dir<4; dir++) {
int x = cur.first + dx[dir];
int y = cur.second + dy[dir];
if(x<0 || x>=r || y<0 || y>=c) continue;
if(v[x][y] == 'X') {
v[x][y] = '.';
water.push({x,y});
}
}
}
return;
}
int main() {
ios_base::sync_with_stdio(false);
cout.tie(NULL);
cin.tie(NULL);
// ์
๋ ฅ
cin >> r >> c;
v.assign(r, "");
for(int i=0; i<r; i++) {
cin >> v[i];
for(int j=0; j<c; j++) {
if(v[i][j] != 'X') {
water.push({i,j});
}
if(v[i][j] == 'L') {
if(start.first==-1 && start.second==-1) {
start = {i,j};
swan.push({i,j});
} else {
goal = {i,j};
}
}
}
}
// ํ์ด
int time = 0;
while(true) {
if(swim()) {
break;
}
melt();
time++;
}
// ์ถ๋ ฅ
cout << time;
return 0;
}
melt ํจ์๋ฅผ ๋จผ์ ์ดํดํ๊ณ swim ํจ์๋ฅผ ์ดํดํ๋๊ฒ ๋์๊ฒ์ด๋ค
'๐๏ธ PS (BOJ) > BFS and DFS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ][C++] ๋ฐฑ์ค 4963๋ฒ: ์ฌ์ ๊ฐ์ (0) | 2023.11.17 |
---|---|
[BOJ][C++] ๋ฐฑ์ค 9466๋ฒ: ํ ํ๋ก์ ํธ (0) | 2023.05.04 |
[BOJ G4][C++] ๋ฐฑ์ค 1600๋ฒ : ๋ง์ด ๋๊ณ ํ ์์ญ์ด (๋ฉ๋ชจ๋ฆฌ์ด๊ณผ๋๋ฌด์ซ์ด) (0) | 2022.04.17 |
[BOJ G5][C++] ๋ฐฑ์ค 13549๋ฒ : ์จ๋ฐ๊ผญ์ง 3 (๋ฐํ์์๋ฌ์์์ ์) (0) | 2022.04.16 |
[BOJ G4][C++] ๋ฐฑ์ค 2573๋ฒ: ๋น์ฐ (0) | 2022.04.15 |