https://www.acmicpc.net/problem/4179
๋ฌธ์
์งํ์ด๋ ๋ฏธ๋ก์์ ์ผ์ ํ๋ค. ์งํ์ด๋ฅผ ๋ฏธ๋ก์์ ํ์ถํ๋๋ก ๋์์ฃผ์!
๋ฏธ๋ก์์์ ์งํ์ด์ ์์น์ ๋ถ์ด ๋ถ์ ์์น๋ฅผ ๊ฐ์ํด์ ์งํ์ด๊ฐ ๋ถ์ ํ๊ธฐ์ ์ ํ์ถํ ์ ์๋์ง์ ์ฌ๋ถ, ๊ทธ๋ฆฌ๊ณ ์ผ๋ง๋ ๋นจ๋ฆฌ ํ์ถํ ์ ์๋์ง๋ฅผ ๊ฒฐ์ ํด์ผํ๋ค.
์งํ์ด์ ๋ถ์ ๋งค ๋ถ๋ง๋ค ํ์นธ์ฉ ์ํ๋๋ ์์ง์ผ๋ก(๋น์ค๋ฌํ๊ฒ ์ด๋ํ์ง ์๋๋ค) ์ด๋ํ๋ค.
๋ถ์ ๊ฐ ์ง์ ์์ ๋ค ๋ฐฉํฅ์ผ๋ก ํ์ฐ๋๋ค.
์งํ์ด๋ ๋ฏธ๋ก์ ๊ฐ์ฅ์๋ฆฌ์ ์ ํ ๊ณต๊ฐ์์ ํ์ถํ ์ ์๋ค.
์งํ์ด์ ๋ถ์ ๋ฒฝ์ด ์๋ ๊ณต๊ฐ์ ํต๊ณผํ์ง ๋ชปํ๋ค.
์ ๋ ฅ
์ ๋ ฅ์ ์ฒซ์งธ ์ค์๋ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ ๋ ์ ์ R๊ณผ C๊ฐ ์ฃผ์ด์ง๋ค. ๋จ, 1 ≤ R, C ≤ 1000 ์ด๋ค. R์ ๋ฏธ๋ก ํ์ ๊ฐ์, C๋ ์ด์ ๊ฐ์์ด๋ค.
๋ค์ ์ ๋ ฅ์ผ๋ก R์ค๋์ ๊ฐ๊ฐ์ ๋ฏธ๋ก ํ์ด ์ฃผ์ด์ง๋ค.
๊ฐ๊ฐ์ ๋ฌธ์๋ค์ ๋ค์์ ๋ปํ๋ค.
- #: ๋ฒฝ
- .: ์ง๋๊ฐ ์ ์๋ ๊ณต๊ฐ
- J: ์งํ์ด์ ๋ฏธ๋ก์์์ ์ด๊ธฐ์์น (์ง๋๊ฐ ์ ์๋ ๊ณต๊ฐ)
- F: ๋ถ์ด ๋ ๊ณต๊ฐ
J๋ ์ ๋ ฅ์์ ํ๋๋ง ์ฃผ์ด์ง๋ค.
ํ์ด
BFS ๋ฌธ์ ์ธ๋ฐ ์ด๊ฑธ ์์ฉํด์ ๋๋ฒ ๋๋ ค์ผํ๋ ๊ทธ๋ฐ ๋ฌธ์ ์๋ค.
๋ถ์ ๋๋ฌ์๊ฐ์ ํ์ํ๋ BFS๋ฅผ ํ๋ฒ ๋๋ฆฌ๊ณ ,
๊ทธ๊ฑธ ๋ฐํ์ผ๋ก ์๊ฐ์ ๋ฐ๋ฅธ ์งํ์ด์ ์์น๋ฅผ BFS ๋ก ๋๋ฆฌ๋ฉด ๋๋ค.
์ด๋ ์งํ์ด์ BFS ๋ฅผ ๋๋ฆด ๋ ์กฐ๊ฑด์ ์ถ๊ฐํ๋ค
(1) ๋ฏธ๋ก์ ํฌ๊ธฐ๋ฅผ ๋ฒ์ด๋๋ฉด ํ์ถ๋ก ๊ฐ์ฃผํ๊ณ ์๊ณ ๋ฆฌ์ฆ ์ข ๋ฃ
// ๋ฏธ๋ก ํ์ถ์ ์ข
๋ฃ
if(x<0 || x>=r || y<0 || y>=c) {
cout << jihun[current.first][current.second] + 1;
return 0;
}
(2) ์งํ์ด๊ฐ ๊ฐ๋ ค๋ ๊ณณ์ ์ด๋ฏธ ๋ถ์ด ์๋ค๋ฉด, ์ฆ ๊ฐ๋ ค๋ ํ์ด๋ฐ๋ณด๋ค ๋จผ์ ๋ถ์ด ๋ถ์๋ค๋ฉด ์ง๋๊ฐ์ง ๋ชปํจ
// ๊ฐ๋ ค๋ ๊ณณ์ ๋ถ์ด ์ด๋ฏธ ์๋ค๋ฉด (ํน์ ๋ฒฝ์ด๋ผ๋ฉด) ํจ์ค
if(fire[x][y] != -1 && jihun[current.first][current.second] + 1 >= fire[x][y]) continue;
๋๋ ์ฌ๊ธฐ์ `fire[x][y] != -1` ์กฐ๊ฑด์ ์๋ฃ์๋ค๊ฐ
"71%์์ ํ๋ ธ์ต๋๋ค"
๊ฐ ๋ ์ ์ ๋จน์๋ค... ๋ถ์ด ์์ ๊ฐ์ง ์์ ๋ถ๋ถ๋ ์๊ฐํ์ด์ผ ํ๋ค.
์๋ฌดํผ ๊ฒฐ๋ก ์ ์ฑ๊ณต
์ฝ๋
// Authored by : seondal
// ํ์ด : https://whkakrkr.tistory.com/
// Co-authored by : -
//#include <bits/stdc++.h>
#include <iostream>
#include <queue>
using namespace std;
int dx[8] = {0,0,1,-1};
int dy[8] = {1,-1,0,0};
queue<pair<int, int>> q;
queue<pair<int, int>> s;
char board[1001][1001];
int fire[1001][1001];
int jihun[1001][1001];
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
// ์
๋ ฅ ๋ฐ๊ธฐ
int r,c;
cin >> r >> c;
for(int i=0; i<r; i++){
for(int j=0; j<c; j++){
cin >> board[i][j];
fire[i][j] = -1;
jihun[i][j] = -1;
if(board[i][j] == 'F'){
q.push({i,j});
fire[i][j] = 0;
}
if(board[i][j] == 'J') {
s.push({i,j});
jihun[i][j] = 0;
}
}
}
// ์๊ฐ์ ๋ฐ๋ฅธ ๋ถ์ ์์น
while(!q.empty()){
pair<int, int> current = q.front();
q.pop();
for(int dir=0; dir<4; dir++){
int x = current.first + dx[dir];
int y = current.second + dy[dir];
if(x<0 || x>=r || y<0 || y>=c) continue;
if(fire[x][y] >= 0 || board[x][y] == '#') continue; // ์ด๋ฏธ ๋ถ์ด ์๊ฑฐ๋ ๋ฒฝ์ด๋ผ๋ฉด ํจ์ค
fire[x][y] = fire[current.first][current.second] + 1;
q.push({x,y});
}
}
// ์๊ฐ์ ๋ฐ๋ฅธ ์งํ์ด์ ์์น
while(!s.empty()) {
pair<int, int> current = s.front();
s.pop();
for(int dir=0; dir<4; dir++){
int x = current.first + dx[dir];
int y = current.second + dy[dir];
// ๋ฏธ๋ก ํ์ถ์ ์ข
๋ฃ
if(x<0 || x>=r || y<0 || y>=c) {
cout << jihun[current.first][current.second] + 1;
return 0;
}
// ์ด๋ฏธ ๋ฐฉ๋ฌธํ๊ฑฐ๋ ๋ฒฝ์ด ์์ผ๋ฉด ํจ์ค
if(jihun[x][y] >= 0 || board[x][y] == '#') continue;
// ๊ฐ๋ ค๋ ๊ณณ์ ๋ถ์ด ์ด๋ฏธ ์๋ค๋ฉด (ํน์ ๋ฒฝ์ด๋ผ๋ฉด) ํจ์ค
if(fire[x][y] != -1 && jihun[current.first][current.second] + 1 >= fire[x][y]) continue;
jihun[x][y] = jihun[current.first][current.second] + 1;
s.push({x,y});
}
}
// ํ์ถ ์คํจ
cout << "IMPOSSIBLE";
return 0;
}
/*
*/
'๐ Baaaaaarking > 0x09๊ฐ - BFS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[BOJ S1][C++] ๋ฐฑ์ค 2583๋ฒ : ์์ญ ๊ตฌํ๊ธฐ (0) | 2022.03.21 |
---|---|
[BOJ G4][C++] ๋ฐฑ์ค 5427๋ฒ : ๋ถ (0) | 2022.03.19 |
[BOJ S2][C++] ๋ฐฑ์ค 7562๋ฒ: ๋์ดํธ์ ์ด๋ (0) | 2022.03.15 |
[BOJ G5][C++] ๋ฐฑ์ค 7569๋ฒ: ํ ๋งํ (0) | 2022.03.10 |
[BOJ G5][C++] ๋ฐฑ์ค 7576๋ฒ: ํ ๋งํ (0) | 2022.03.09 |