- toc {:toc}
๋ฌธ์
์๊ทผ์ด๋ ๋น ๊ณต๊ฐ๊ณผ ๋ฒฝ์ผ๋ก ์ด๋ฃจ์ด์ง ๊ฑด๋ฌผ์ ๊ฐํ์๋ค. ๊ฑด๋ฌผ์ ์ผ๋ถ์๋ ๋ถ์ด ๋ฌ๊ณ , ์๊ทผ์ด๋ ์ถ๊ตฌ๋ฅผ ํฅํด ๋ฐ๊ณ ์๋ค.
๋งค ์ด๋ง๋ค, ๋ถ์ ๋์๋จ๋ถ ๋ฐฉํฅ์ผ๋ก ์ธ์ ํ ๋น ๊ณต๊ฐ์ผ๋ก ํผ์ ธ๋๊ฐ๋ค. ๋ฒฝ์๋ ๋ถ์ด ๋ถ์ง ์๋๋ค. ์๊ทผ์ด๋ ๋์๋จ๋ถ ์ธ์ ํ ์นธ์ผ๋ก ์ด๋ํ ์ ์์ผ๋ฉฐ, 1์ด๊ฐ ๊ฑธ๋ฆฐ๋ค. ์๊ทผ์ด๋ ๋ฒฝ์ ํต๊ณผํ ์ ์๊ณ , ๋ถ์ด ์ฎ๊ฒจ์ง ์นธ ๋๋ ์ด์ ๋ถ์ด ๋ถ์ผ๋ ค๋ ์นธ์ผ๋ก ์ด๋ํ ์ ์๋ค. ์๊ทผ์ด๊ฐ ์๋ ์นธ์ ๋ถ์ด ์ฎ๊ฒจ์ด๊ณผ ๋์์ ๋ค๋ฅธ ์นธ์ผ๋ก ์ด๋ํ ์ ์๋ค.
๋น๋ฉ์ ์ง๋๊ฐ ์ฃผ์ด์ก์ ๋, ์ผ๋ง๋ ๋นจ๋ฆฌ ๋น๋ฉ์ ํ์ถํ ์ ์๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ์งธ ์ค์ ํ ์คํธ ์ผ์ด์ค์ ๊ฐ์๊ฐ ์ฃผ์ด์ง๋ค. ํ ์คํธ ์ผ์ด์ค๋ ์ต๋ 100๊ฐ์ด๋ค.
๊ฐ ํ ์คํธ ์ผ์ด์ค์ ์ฒซ์งธ ์ค์๋ ๋น๋ฉ ์ง๋์ ๋๋น์ ๋์ด w์ h๊ฐ ์ฃผ์ด์ง๋ค. (1 โค w,h โค 1000)
๋ค์ h๊ฐ ์ค์๋ w๊ฐ์ ๋ฌธ์, ๋น๋ฉ์ ์ง๋๊ฐ ์ฃผ์ด์ง๋ค.
- โ.โ: ๋น ๊ณต๊ฐ
- โ#โ: ๋ฒฝ
- โ@โ: ์๊ทผ์ด์ ์์ ์์น
- โ*โ: ๋ถ
๊ฐ ์ง๋์ @์ ๊ฐ์๋ ํ๋์ด๋ค.
์ถ๋ ฅ
๊ฐ ํ ์คํธ ์ผ์ด์ค๋ง๋ค ๋น๋ฉ์ ํ์ถํ๋๋ฐ ๊ฐ์ฅ ๋น ๋ฅธ ์๊ฐ์ ์ถ๋ ฅํ๋ค. ๋น๋ฉ์ ํ์ถํ ์ ์๋ ๊ฒฝ์ฐ์๋ โIMPOSSIBLEโ์ ์ถ๋ ฅํ๋ค.
์ถ์ฒ: https://www.acmicpc.net/problem/5427
ํ์ด
ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ฌ๋ฌ ๊ฐ๋ก ์ฌ์ฉํ๊ธฐ ๋๋ฌธ์ ์ด๊ธฐํ๋ฅผ ์งํํด์ฃผ๋ ๊ฒ์ด ์ค์ํ๋ค.
4179: ๋ถ!์์ ํ์๋ฏ์ด ๋ถ์ BFS๋จผ์ distance๋ฅผ ๊ธฐ๋กํ๊ณ ๋ถ์ distance๋ณด๋ค ์๊ทผ์ด(1๋ฐ2์ผ ์๊ทผ์ด๊ฐ ์๊ฐ๋์ dog๋ผ ํ๋ค)์ distance๊ฐ ๋ ์์ ๋ ์ด๋ํ ์ ์๋๋ก ์ฝ๋ฉํ๋ค.
4179: ๋ถ!์์๋ ํ ์คํธ ์ผ์ด์ค๊ฐ ์์ด return 0๋ฅผ ํตํด ์์ ํ๋ก๊ทธ๋จ์ ์ข ๋ฃํ๋ฉด ๋์ง๋ง ์ด ๋ฌธ์ ์์๋ ํ ์คํธ ์ผ์ด์ค๋ฅผ ์ด์ด๋๊ฐ์ผ ํ๊ธฐ ๋๋ฌธ์ ์ ๋ฐฉ์์ ์ฌ์ฉํ ์ ์์๋ค.
โ ๋๋ฌธ์ break๋ฅผ ์ฌ์ฉํ์ง๋ง break๋ ๋ฌถ์ฌ์๋ ํ๋์ ๋ฐ๋ณต๋ฌธ๋ง ์ค์ง์ํค๊ธฐ ๋๋ฌธ์ ์ด์ค for๋ฌธ์ ๋ชจ๋ ์ค์ง์ํฌ ์ ์์๊ณ ์ด๊ฒ์ด ํ๋ฆฌ๋ ์ด์ ์๋ค.
โ ์ด ๋ฌธ์ ๋ ๊ทธ๋ฅ ์ค์ง์ํค์ง ์๊ณ ์ต์๊ฐ์ ์ฐพ๋ ๋ฐฉ๋ฒ,
endflag๋ฅผ ์ด์ฉํ์ฌ ์ด์ค for๋ฌธ์ ํ์ถํ๋ ๋ฐฉ๋ฒ์ ์ด์ฉํด ํด๊ฒฐํ์.
#include <bits/stdc++.h>
using namespace std;
#define X first
#define Y second
#define MX 10000000
char board[1002][1002];
int dog[1002][1002];
int fire[1002][1002];
int T, w, h;
int dx[4] = {0, -1, 0, 1};
int dy[4] = {-1, 0, 1, 0};
queue<pair<int, int>> Dq, Fq;
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin >> T;
while(T--){
cin >> w >> h;
int ans = MX;
// board์ fire, dog์ ๊ฐ์ ์ด๊ธฐํ ํด์ค๋ค.
// w, h๋ฒ์ ๋ฐ์ bfs ์กฐ๊ฑด์์ ๊ฑฐ๋ฅด๊ธฐ ๋๋ฌธ์ ์ด๊ธฐํํ ํ์ ์๋ค.
for(int i = 0; i < h; i++){
for(int j = 0; j < w; j++){
cin >> board[i][j];
if(board[i][j] == '*'){
fire[i][j] = 0;
dog[i][j] = -1;
Fq.push({i, j});
}
else if(board[i][j] == '@'){
dog[i][j] = 0;
fire[i][j] = -1;
Dq.push({i, j});
}
else{
dog[i][j] = -1;
fire[i][j] = -1;
}
}
}
// ๋ถ์ bfs
while(!Fq.empty()){
auto cur = Fq.front(); Fq.pop();
for(int dir = 0; dir < 4; dir++){
int nx = cur.X + dx[dir];
int ny = cur.Y + dy[dir];
if(nx < 0 || nx >= h || ny < 0 || ny >= w) continue;
if(board[nx][ny] == '#' || fire[nx][ny] >= 0) continue;
fire[nx][ny] = fire[cur.X][cur.Y] + 1;
Fq.push({nx, ny});
}
}
/*
for(int i = 0; i < h ; i++){
for(int j = 0; j < w; j++){
cout << fire[i][j] << '\t';
}
cout << endl;
}
cout << endl;
*/
// ์๊ทผ์ bfs
int endflag = 0;
while(!Dq.empty()){
auto cur = Dq.front(); Dq.pop();
for(int dir=0; dir < 4; dir++){
int nx = cur.X + dx[dir];
int ny = cur.Y + dy[dir];
if(nx < 0 || nx >= h || ny < 0 || ny >= w){
// ans = min(ans, dog[cur.X][cur.Y]+1);
// break๋์ min์ผ๋ก ๊ฐ์ฅ ๋น ๋ฅธ ํ์ถ ๊ฐ๋ฅ ์๊ฐ์ ๊ตฌํ๋ค.
ans = dog[cur.X][cur.Y]+1;
endflag=1;
break;
}
if(board[nx][ny] == '#' || dog[nx][ny] >= 0) continue;
if(fire[nx][ny] != -1 && fire[nx][ny] <= dog[cur.X][cur.Y]+1) continue;
dog[nx][ny] = dog[cur.X][cur.Y] + 1;
Dq.push({nx, ny});
}
if(endflag) break;
}
/*
for(int i = 0; i < h ; i++){
for(int j = 0; j < w; j++){
cout << dog[i][j] << '\t';
}
cout << endl;
}
*/
if(ans != MX)
cout << ans << endl;
else
cout << "IMPOSSIBLE" << endl;
while(!Dq.empty()){
Dq.pop();
}
}
}