• 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();
        }
    }
}