๐Ÿ• Baaaaaarking/0x09๊ฐ• - BFS

[BOJ G4][C++] ๋ฐฑ์ค€ 4179๋ฒˆ: ๋ถˆ!

์„ ๋‹ฌ 2022. 3. 16. 15:56
๋ฐ˜์‘ํ˜•

https://www.acmicpc.net/problem/4179

 

4179๋ฒˆ: ๋ถˆ!

์ž…๋ ฅ์˜ ์ฒซ์งธ ์ค„์—๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ ๋‘ ์ •์ˆ˜ R๊ณผ C๊ฐ€ ์ฃผ์–ด์ง„๋‹ค. ๋‹จ, 1 ≤ R, C ≤ 1000 ์ด๋‹ค. R์€ ๋ฏธ๋กœ ํ–‰์˜ ๊ฐœ์ˆ˜, C๋Š” ์—ด์˜ ๊ฐœ์ˆ˜์ด๋‹ค. ๋‹ค์Œ ์ž…๋ ฅ์œผ๋กœ R์ค„๋™์•ˆ ๊ฐ๊ฐ์˜ ๋ฏธ๋กœ ํ–‰์ด ์ฃผ์–ด์ง„๋‹ค.  ๊ฐ๊ฐ์˜ ๋ฌธ

www.acmicpc.net

 

๋ฌธ์ œ

์ง€ํ›ˆ์ด๋Š” ๋ฏธ๋กœ์—์„œ ์ผ์„ ํ•œ๋‹ค. ์ง€ํ›ˆ์ด๋ฅผ ๋ฏธ๋กœ์—์„œ ํƒˆ์ถœํ•˜๋„๋ก ๋„์™€์ฃผ์ž!

๋ฏธ๋กœ์—์„œ์˜ ์ง€ํ›ˆ์ด์˜ ์œ„์น˜์™€ ๋ถˆ์ด ๋ถ™์€ ์œ„์น˜๋ฅผ ๊ฐ์•ˆํ•ด์„œ ์ง€ํ›ˆ์ด๊ฐ€ ๋ถˆ์— ํƒ€๊ธฐ์ „์— ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋Š”์ง€์˜ ์—ฌ๋ถ€, ๊ทธ๋ฆฌ๊ณ  ์–ผ๋งˆ๋‚˜ ๋นจ๋ฆฌ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋Š”์ง€๋ฅผ ๊ฒฐ์ •ํ•ด์•ผํ•œ๋‹ค.

์ง€ํ›ˆ์ด์™€ ๋ถˆ์€ ๋งค ๋ถ„๋งˆ๋‹ค ํ•œ์นธ์”ฉ ์ˆ˜ํ‰๋˜๋Š” ์ˆ˜์ง์œผ๋กœ(๋น„์Šค๋“ฌํ•˜๊ฒŒ ์ด๋™ํ•˜์ง€ ์•Š๋Š”๋‹ค)  ์ด๋™ํ•œ๋‹ค. 

๋ถˆ์€ ๊ฐ ์ง€์ ์—์„œ ๋„ค ๋ฐฉํ–ฅ์œผ๋กœ ํ™•์‚ฐ๋œ๋‹ค. 

์ง€ํ›ˆ์ด๋Š” ๋ฏธ๋กœ์˜ ๊ฐ€์žฅ์ž๋ฆฌ์— ์ ‘ํ•œ ๊ณต๊ฐ„์—์„œ ํƒˆ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค. 

์ง€ํ›ˆ์ด์™€ ๋ถˆ์€ ๋ฒฝ์ด ์žˆ๋Š” ๊ณต๊ฐ„์€ ํ†ต๊ณผํ•˜์ง€ ๋ชปํ•œ๋‹ค.

์ž…๋ ฅ

์ž…๋ ฅ์˜ ์ฒซ์งธ ์ค„์—๋Š” ๊ณต๋ฐฑ์œผ๋กœ ๊ตฌ๋ถ„๋œ ๋‘ ์ •์ˆ˜ 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;
}

/*
 */

 

๋ฐ˜์‘ํ˜•