๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
Algorithm๐Ÿฐ/๋ฐฑ์ค€

[๋ฐฑ์ค€] 13460 ๊ตฌ์Šฌ ์ฐพ๊ธฐ2 BFS

by Jouureee 2021. 4. 22.

๋ฌธ์ œ :

www.acmicpc.net/problem/13460

 

13460๋ฒˆ: ๊ตฌ์Šฌ ํƒˆ์ถœ 2

์ฒซ ๋ฒˆ์งธ ์ค„์—๋Š” ๋ณด๋“œ์˜ ์„ธ๋กœ, ๊ฐ€๋กœ ํฌ๊ธฐ๋ฅผ ์˜๋ฏธํ•˜๋Š” ๋‘ ์ •์ˆ˜ N, M (3 โ‰ค N, M โ‰ค 10)์ด ์ฃผ์–ด์ง„๋‹ค. ๋‹ค์Œ N๊ฐœ์˜ ์ค„์— ๋ณด๋“œ์˜ ๋ชจ์–‘์„ ๋‚˜ํƒ€๋‚ด๋Š” ๊ธธ์ด M์˜ ๋ฌธ์ž์—ด์ด ์ฃผ์–ด์ง„๋‹ค. ์ด ๋ฌธ์ž์—ด์€ '.', '#', 'O', 'R', 'B'

www.acmicpc.net

๋ถ„์„ :

์ด ๋ฌธ์ œ๋Š” ์‚ผ์„ฑ ์–ด์ฉŒ๊ตฌ ์—ญ๋Ÿ‰ ๊ธฐ์ถœ ๋ฌธ์ œ์˜€๋‹ค. ์•„์ง ๊ธฐ์ถœ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๊ฐ์ด ์—†๋‹ค. ๊ธฐ์—… ์ฝ”๋”ฉํ…Œ์ŠคํŠธ๋Š” ๋‹ค ๊ธฐ์—… ์ฝ”๋”ฉํ…Œ์ŠคํŠธ ๊ฐ™์•„์„œ ๋ง์ด๋‹ค ํ•˜ํ•˜

์–ด์ฉผ๋“  ๊ทธ๋ž˜ํ”„ ์ด๋ก ์„ ๋ณต์Šตํ•˜๋Š” ์™€์ค‘์— ํ•œ๋ฒˆ ํ’€์–ด๋ณผ๊นŒ ? ํ•ด์„œ ๋„์ „ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค. ๋ฌธ์ œ๋ฅผ ์ฝ๋‹ค๊ฐ€ ์ดํ•ด๊ฐ€ ๋˜๋ฉด ๋ฌธ์ œ ํฌ๊ธฐ๋ฅผ ๋ชปํ•˜๊ฒ ๋‹ค.

input ๋ฐ›๋Š”๊ฒƒ๋งŒ ๋งŒ๋“ค๊ณ  ๋‹ค๋ฅธ ๋ธ”๋กœ๊ทธ๋‹˜๋“ค์˜ ๊ธ€์„ ์ฐธ๊ณ ํ•˜์—ฌ ๊ฒจ์šฐ ๊ฒจ์šฐ ํ’€์—ˆ๋‹ค. ์ด ๋งˆ์ €๋„ ์˜ˆ์™ธ ์ฒ˜๋ฆฌ๋ฅผ ํ•˜์ง€ ์•Š์•„ ๊ณ„์† ํ‹€๋ฆฌ๋‹ค๊ฐ€ ๊ฒจ์šฐ ํ…Œ์ŠคํŠธ ์ผ€์ด์Šค๊ฐ€ ์˜œ๋‹ค ํ•˜๊ณ  ๋งž์ถฐ์ค€ ๋Š๋‚Œ .. 

 

๋ฐฑ์ค€ ์งˆ๋ฌธ ๊ธ€์„ ํ†ตํ•ด visit ๋ฐฐ์—ด์„ 4์ฐจ์›์œผ๋กœ ํ•ด์•ผ ํ•˜๋Š” ์ด์œ ๋ฅผ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. ๊ตฌ์Šฌ์ด ๋™์‹œ์— ํ†ต๊ณผํ•  ์ˆ˜๋„ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋นจ๊ฐ„ ๊ตฌ์Šฌ๊ณผ ํŒŒ๋ž€ ๊ตฌ์Šฌ์˜ ๋ฐฉ๋ฌธ ์—ฌ๋ถ€๋ฅผ ๊ฐ™์ด ๊ฒ€์‚ฌํ•ด์•ผํ•œ๋‹ค๋Š” ๊ฒƒ! ๊ทธ๋ž˜์„œ 4์ฐจ์› ๋ฐฐ์—ด์„ ์จ์•ผ ํ•œ๋‹ค๊ณ  ํ–ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ฐฉ๋ฌธ๋œ ๊ณณ์„ ๋˜ ๊ฐ„๋‹ค๋Š” ๋œป์€ ์™”๋˜ ๊ธธ์„ ๋ฐ˜๋ณตํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— 10๋ฒˆ ์•ˆ์— ํ†ต๊ณผํ•˜์ง€ ๋ชปํ• ์ˆ˜๋„ ์žˆ์–ด ์™”๋˜ ๊ธธ์„ ๊ฐ€์ง€ ์•Š์•„์•ผ ํ•œ๋‹ค๋Š” ๋œป์„ ์•”์‹œํ•˜๊ณ  ์žˆ๋‹ค๊ณ  ํ•œ๋‹ค.

 

๊ทธ๋ฆฌ๊ณ  ๋˜ ์‹ ๊ธฐํ•œ ์ ์€ ๊ฐ™์€ ๋ฐฉํ–ฅ์œผ๋กœ ๊ธฐ์šธ์˜€์„ ๋•Œ ๊ตฌ์Šฌ์ด ๊ฐ™์€ ์ธ๋ฑ์Šค์— ๊ฐ™์ด ๋จธ๋ฌด๋ฅผ์ˆ˜๊ฐ€ ์žˆ์„ํ…๋ฐ ๊ทธ๋Ÿฌ๋ฉด ์•ˆ๋˜๋ฏ€๋กœ ์ด์ „ ์œ„์น˜์—์„œ ์›€์ง์ธ ์œ„์น˜๋กœ ๊ฐ„ ๊ธธ์ด๊ฐ€ ๋” ๋งŽ์€ ์นœ๊ตฌ์˜ ์ธ๋ฑ์Šค ๊ฐ’์„ ์™”๋˜ ๋ฐฉํ–ฅ์œผ๋กœ ํ•˜๋‚˜ ๊ฐ์†Œ์‹œ์ผœ์ค€๋‹ค๊ณ  ํ•œ๋‹ค! 

 

์—ฌ๋Ÿฌ๋ชจ๋กœ ์‹ ๊ธฐํ•œ ๊ฒƒ๋“ค์ด ๋งŽ์•˜๋˜ ๋ฌธ์ œ์˜€๋‹ค ๊ธ€๊ณ  ๋„˜ ์–ด๋ ต๋‹ค ใ…œ  

 

c++ ์ฝ”๋“œ :

//
//  13460_marbleEscape2.cpp
//  SOMA๐Ÿ‘ฉ๐Ÿปโ€๐Ÿ’ป
//
//  Created by JoSoJeong on 2021/04/22.
//

#include <stdio.h>
#include <iostream>
#include <vector>
#include <queue>
#include <math.h>

using namespace std;

char map[11][11];
bool visit[11][11][11][11] = {false, };


int N, M;

pair<int, int> redStart;
pair<int, int> blueStart;
pair<int, int> holeStart;

int dx[] = { 0, 0, 1, -1 }; //up down left right
int dy[] = { 1, -1, 0, 0 };

int find_hole_bfs(){
    queue<pair<pair<int, int>, pair<int, int>>>q; // red๊บผ, blue๊บผ
    q.push({redStart, blueStart}); // ํ์— red blue๊บผ x, y ์ˆœ์œผ๋กœ push
    visit[redStart.first][redStart.second][blueStart.first][blueStart.second] = true;
    int result = 0; //๋‹ต
    
    if(result == 10){
        return -1;
    }
    
    while(!q.empty()){
        int size = (int)q.size();
        while(size--){

        pair<pair<int, int>, pair<int, int>> cur = q.front();
        q.pop();
        
        int redX = cur.first.first;
        int redY = cur.first.second;
        int blueX = cur.second.first;
        int blueY = cur.second.second;
        
        if(map[redX][redY] == 'O' && map[redX][redY] != map[blueX][blueY]){ // ๊ตฌ๋ฉ์„ ์ฐพ์œผ๋ฉด ๊ทผ๋ฐ ๊ฐ™์ด ํ†ต๊ณผํ•˜์ง€ ์•Š์œผ๋ฉด
            return result;
        }
            
        
        // ์›€์ง์ด์ž
        for(int i =0; i < 4; i++){
            int nextRedX = redX;
            int nextRedY = redY;
            int nextBlueX = blueX;
            int nextBlueY = blueY;

            while(map[nextRedX + dx[i]][nextRedY + dy[i]] != '#' && map[nextRedX][nextRedY] != 'O'){
                nextRedX += dx[i];
                nextRedY += dy[i];
            }
            
            while(map[nextBlueX + dx[i]][nextBlueY + dy[i]] !='#' && map[nextBlueX][nextBlueY] != 'O'){
                nextBlueX += dx[i];
                nextBlueY += dy[i];
            }
    
            if(map[nextBlueX][nextBlueY] == 'O') // ํŒŒ๋ž€ ๊ณต์ด ๋จผ์ € ๋„์ฐฉํ–ˆ์„ ๊ฒฝ์šฐ ์˜ˆ์™ธ์ฒ˜๋ฆฌ!! ์ด๋ถ€๋ถ„ ์•ˆํ•ด์„œ ํ‹€๋ ธ๋‹ค.
            {
                continue;
            }
            
            if(nextRedX == nextBlueX && nextRedY == nextBlueY){ // ๋‘ ๊ณต์˜ ์œ„์น˜๊ฐ€ ๊ฐ™๋‹ค๋ฉด
                //์›€์ง์ธ ๊ฑฐ๋ฆฌ๋กœ ๋ˆ„๊ฐ€ ๋’ค์— ๊ฐˆ์ง€ ํŒ๋ณ„
                if(map[nextRedX][nextRedY] == 'O')
                {
                    continue;
                }
                
                if(abs(nextRedX- redX) + abs(nextRedY - redY) < abs(nextBlueX - blueX) + abs(nextBlueY - blueY)){
                    nextBlueX -= dx[i];
                    nextBlueY -= dy[i];
                }else{
                    nextRedX -= dx[i];
                    nextRedY -= dy[i];
                }
            }
            
            if (visit[nextRedX][nextRedY][nextBlueX][nextBlueY]) continue; // ๋ฐฉ๋ฌธ ํ–ˆ๋‹ค๋ฉด ๋ฌด์‹œ
            visit[nextRedX][nextRedY][nextBlueX][nextBlueY] = true; // ๋ฐฉ๋ฌธ ํ‘œ์‹œ
            q.push({ {nextRedX,nextRedY}, {nextBlueX, nextBlueY}});
        }
    }
    if (result >= 10) return -1; // ๋ฌธ์ œ ์กฐ๊ฑด
    result++;
        
        
        
    }
    
    return -1; // queue๊ฐ€ ๋น„์–ด์žˆ์„๋•Œ
}

int main(){
    cin >> N >> M;
    for(int i = 1; i<= N; i++){
        for(int j = 1; j<= M; j++){
            char temp;
            cin >> temp;
            if(temp == 'R'){
                redStart = make_pair(i, j); // ๋นจ๊ฐ„ ๊ตฌ์Šฌ ์‹œ์ž‘ ์œ„์น˜ ๊ธฐ๋ก
            }else if(temp == 'B'){
                blueStart = make_pair(i, j);
            }else if(temp == 'O'){
                holeStart = make_pair(i, j);
            }
            map[i][j] = temp;
        }
    }
    
//    for(int i = 1; i<= N; i++){
//        for(int j = 1; j<= M; j++){
//            cout << map[i][j] << " ";
//        }
//        cout <<'\n';
//    }
    
    cout << find_hole_bfs() << '\n';
    
    return 0;
}

๋Œ“๊ธ€