[๋ฐฑ์ค€] [C++] ๐Ÿ”ฎ ๊ตฌ์Šฌ ํƒˆ์ถœ 2 13460๋ฒˆ

๐Ÿ’ก ๋ฌธ์ œ ์„ค๋ช…

๊ตฌ์Šฌ ํƒˆ์ถœ 2

bfs ์ตœ๋‹จ๊ฑฐ๋ฆฌ ๋ฌธ์ œ์ด๋ฉด์„œ, ๊ณต์ด ๋‘๊ฐœ๋ผ์„œ ๊ตฌํ˜„์ด ๊นŒ๋‹ค๋กญ๋‹ค.


๐Ÿ’ก ์ด๋™ ํ•จ์ˆ˜

4 ๋ฐฉํ–ฅ์œผ๋กœ ์ด๋™ํ–ˆ์„๋•Œ,

๋นจ๊ฐ„๊ณต๊ณผ ํŒŒ๋ž€ ๊ณต์˜ ์œ„์น˜๋ฅผ returnํ•ด์ฃผ๋Š” ํ•จ์ˆ˜๋ฅผ ๋งŒ๋“ค์—ˆ๋‹ค.

ํ•ญ์ƒ ๋ฐ”๊นฅ์ชฝ์—๋Š” ๋ฒฝ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋ฐ–์œผ๋กœ ๋–จ์–ด์งˆ ์ผ์€ ์—†์œผ๋‹ˆ ๋ฒฝ๊ณผ ๋งŒ๋‚ ๋•Œ๊นŒ์ง€ ์ด๋™์‹œ์ผœ์ค€๋‹ค.

  • ์ค‘๊ฐ„์— ๊ณต์ด ๊ตฌ๋ฉ์œผ๋กœ ๋“ค์–ด๊ฐ€๋ฉด ํŠน๋ณ„ํ•˜๊ฒŒ ์ฒ˜๋ฆฌํ•ด์ฃผ๊ธฐ ์œ„ํ•ด์„œ, ์ขŒํ‘œ๋ฅผ ์Œ์ˆ˜๋กœ ํ‘œ๊ธฐํ•ด์ค€๋‹ค.

๋งŒ์•ฝ ํŒŒ๋ž€ ๊ณต๊ณผ ๋นจ๊ฐ„ ๊ณต์˜ ์œ„์น˜๊นŒ์ง€ ์ƒ๊ฐํ•ด์„œ ๊ตฌํ˜„ํ•˜๋ ค๋ฉด ์•„์ฃผ ๋ณต์žกํ•˜๊ณ  ๊ธธ์–ด์ง€๋Š”๋ฐ,

๊ทธ๋ ‡๊ฒŒ ํ•˜์ง€ ๋ง๊ณ  ๋ฌด์‹œํ•˜๊ณ  ์ด๋™ ํ•œ ํ›„, ๋‘ ๊ณต์˜ ์ขŒํ‘œ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ์ฒ˜๋ฆฌ๋ฅผ ํ•ด์ฃผ๋ฉด ๋œ๋‹ค.

  • ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•
  • ์•„๋ž˜ ์ƒํƒœ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ„๋‹ค๊ณ  ํ•ด๋ณด์ž.
  • R . . . B . . #
  • ๊ทธ๋ƒฅ ์ด๋™์„ ํ•˜๋ฉด R๊ณผ B๊ฐ€ ๊ฐ™์€ ์œ„์น˜์— ์ฐํž ๊ฒƒ์ด๋‹ค.
  • . . . . . . (RB) #
  • ๊ฐ™์€ ์œ„์น˜๋ผ๋ฉด, ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ์„œ ๋’ค๋”ฐ๋ผ์˜ค๋˜ ์• ๋ฅผ ํ•œ์นธ ์ „์œผ๋กœ ๋Œ๋ฆฌ๋ฉด ๋œ๋‹ค.
  • . . . . . R B #
// ์•„๋ž˜, ์œ„, ์˜ค๋ฅธ, ์™ผ
const int dx[] = { 1,-1,0,0 };
const int dy[] = { 0,0,1,-1 };

tuple<int,int,int,int> go(int dir, int rx, int ry, int bx, int by){

    int nrx=rx, nry=ry, nbx=bx, nby=by;
    // Red
    while(true){
        nrx+=dx[dir]; nry+=dy[dir];
        if (board[nrx][nry]=='#') {
            nrx-=dx[dir]; nry-=dy[dir];
            break;
        }
        // ๊ตฌ๋ฉ์œผ๋กœ ๋น ์ง : -1๋กœ ํ‘œ์‹œ
        if (board[nrx][nry]=='O'){
            nrx = -1; nry = -1;
            break;
        }
    } 
    // Blue
    while(true){
        nbx+=dx[dir]; nby+=dy[dir];
        if (board[nbx][nby]=='#') {
            nbx-=dx[dir]; nby-=dy[dir];
            break;
        }
        // ๊ตฌ๋ฉ์œผ๋กœ ๋น ์ง : -2๋กœ ํ‘œ์‹œ
        if (board[nbx][nby]=='O'){
            nbx = -2; nby = -2;
            break;
        }
    }
    // ๋‘ ์ขŒํ‘œ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๊ฒน์น  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ฒ˜๋ฆฌ
    if(nrx==nbx && nry==nby){
        // ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ„๊ฑฐ๋ผ๋ฉด ์œ„์—์žˆ๋˜๊ฑธ ํ•œ๋‹จ๊ณ„ ์ „์œผ๋กœ
        if (dir==0){
            if (bx<rx) nbx -= dx[dir];
            else nrx -= dx[dir];
        }
        // ์œ„๋กœ ์˜ฌ๋ผ๊ฐ„๊ฑฐ๋ผ๋ฉด ์•„๋ž˜์žˆ๋˜๊ฑธ ํ•œ๋‹จ๊ณ„ ์ „์œผ๋กœ
        else if (dir==1){
            if (bx>rx) nbx -= dx[dir];
            else nrx -= dx[dir];
        }
        // ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ„๊ฑฐ๋ผ๋ฉด ์™ผ์ชฝ์— ์žˆ๋˜๊ฑธ ํ•œ๋‹จ๊ณ„ ์ „์œผ๋กœ
        else if (dir==2){
            if (by<ry) nby -= dy[dir];
            else nry -= dy[dir];
        }
        // ์™ผ์ชฝ์œผ๋กœ ๊ฐ„๊ฑฐ๋ผ๋ฉด ์˜ค๋ฅธ์ชฝ์— ์žˆ๋˜๊ฑธ ํ•œ๋‹จ๊ณ„ ์ „์œผ๋กœ
        else if (dir==3){
            if (by>ry) nby -= dy[dir];
            else nry -= dy[dir];
        }
    }

    return {nrx, nry, nbx, nby};
}

๐Ÿ’ก BFS ์ตœ๋‹จ๊ฑฐ๋ฆฌ

BFS ์ด๊ธฐ ๋•Œ๋ฌธ์— dist๊ฐ€ ๋‚ฎ์€ ๊ฒƒ๋ถ€ํ„ฐ ์ฒ˜๋ฆฌ๋œ๋‹ค.

10๋ฒˆ ์•ˆ์— ๋„์ฐฉํ•˜์ง€ ๋ชปํ•˜๋Š” ๊ฒฝ์šฐ ๋ฐ”๋กœ ์ข…๋ฃŒ์‹œ์ผœ์ฃผ๋ฉด ๋œ๋‹ค.

์œ„ go ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด B์˜ x์ขŒํ‘œ๊ฐ€ -2๊ฐ€ ๋˜์—ˆ๋‹ค๋ฉด ๋น ์ง„ ๊ฒƒ์ด๋ฏ€๋กœ, ๋”์ด์ƒ ์ง„ํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋‹ค์Œ ํ๋กœ ์ด๋™ํ•œ๋‹ค.

B๋Š” ์•ˆ๋น ์ง€๋ฉด์„œ R์˜ x์ขŒํ‘œ๊ฐ€ -1์ด๋ฉด ์„ฑ๊ณตํ•œ๊ฒƒ์ด๋ฏ€๋กœ dist+1 ์„ ๋ฆฌํ„ดํ•œ๋‹ค.

int bfs(int start_rx, int start_ry, int start_bx, int start_by){
    
    // Red ์ขŒํ‘œ, Blue์ขŒํ‘œ, ๊ฑฐ๋ฆฌ
    queue<tuple<int,int,int,int,int>> q;
    q.push({start_rx, start_ry, start_bx, start_by, 0});
    visited[start_rx][start_ry][start_bx][start_by]=true;
    
    while (!q.empty()){
        auto [rx, ry, bx, by, now_dist] = q.front();

        // 10๋ฒˆ ์•ˆ์— ๋„์ฐฉ ๋ชปํ–ˆ์„ ๊ฒฝ์šฐ
        // 10๋„ ํฌํ•จํ•ด์•ผํ•˜๋Š” ์ด์œ  : ์ง€๊ธˆ๊นŒ์ง€ ์˜จ๊ฒŒ 10์ด๋ฉด,
        // ๋‹ค์Œ๋‹จ๊ณ„์— ๋„๋‹ฌํ•ด๋„ return์€ 11์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์—
        if (now_dist>=10) {
            return -1;
        }

        q.pop();
        for (int i=0; i<4; i++){
            // ์ด๋™
            auto [nrx, nry, nbx, nby] = go(i, rx, ry, bx, by);

            // ํŒŒ๋ž€์ƒ‰์ด ๊ตฌ๋ฉ์— ๋น ์ง
            if (nbx==-2) continue;

            // ํŒŒ๋ž€์ƒ‰์€ ์•ˆ๋น ์ง€๊ณ  ๋นจ๊ฐ„์ƒ‰์ด ๊ตฌ๋ฉ์— ๋น ์ง€๋ฉด ์ข…๋ฃŒ
            if (nrx==-1) return now_dist+1;

            if (visited[nrx][nry][nbx][nby]) continue;
            visited[nrx][nry][nbx][nby] = true;
            q.push({nrx, nry, nbx, nby, now_dist + 1});
        }
    }
    return -1;  // ๋„๋‹ฌ ๋ชปํ–ˆ์„ ๊ฒฝ์šฐ
}

๐Ÿ’ก ๋‚ด ํ’€์ด

#include <bits/stdc++.h>
#define FOR(i,a,b) for(int i=(a);i<(b);i++)
#define all(v) v.begin(), v.end()
using namespace std;
typedef long long ll;
typedef pair<int,int> pii; typedef pair<ll,ll> pll;
typedef tuple<int,int,int> tiii;
const int INF = 0x7f7f7f7f;

/*--
https://www.acmicpc.net/problem/13460

์ƒํ•˜์ขŒ์šฐ๋กœ ๊ธฐ์šธ์—ฌ์„œ
R์ด O๋กœ ๋“ค์–ด๊ฐ€์•ผํ•จ.
๋™์‹œ์— R, B ๊ฐ€ ๋“ค์–ด๊ฐ€๋ฉด ์•ˆ๋จ

#์€ ์žฅ์• ๋ฌผ, .์€ ๋นˆ๊ณต๊ฐ„
*/

#define MAX 10

int N, M;
char board[MAX][MAX];
bool visited[MAX][MAX][MAX][MAX];  // ๋นจ๊ฐ„ ๊ตฌ์Šฌ, ํŒŒ๋ž€๊ตฌ์Šฌ

// ์•„๋ž˜, ์œ„, ์˜ค๋ฅธ, ์™ผ
const int dx[] = { 1,-1,0,0 };
const int dy[] = { 0,0,1,-1 };

tuple<int,int,int,int> go(int dir, int rx, int ry, int bx, int by){

    int nrx=rx, nry=ry, nbx=bx, nby=by;
    // Red
    while(true){
        nrx+=dx[dir]; nry+=dy[dir];
        if (board[nrx][nry]=='#') {
            nrx-=dx[dir]; nry-=dy[dir];
            break;
        }
        // ๊ตฌ๋ฉ์œผ๋กœ ๋น ์ง : -1๋กœ ํ‘œ์‹œ
        if (board[nrx][nry]=='O'){
            nrx = -1; nry = -1;
            break;
        }
    } 
    // Blue
    while(true){
        nbx+=dx[dir]; nby+=dy[dir];
        if (board[nbx][nby]=='#') {
            nbx-=dx[dir]; nby-=dy[dir];
            break;
        }
        // ๊ตฌ๋ฉ์œผ๋กœ ๋น ์ง : -2๋กœ ํ‘œ์‹œ
        if (board[nbx][nby]=='O'){
            nbx = -2; nby = -2;
            break;
        }
    }
    // ๋‘ ์ขŒํ‘œ๊ฐ€ ๊ฐ™๋‹ค๋ฉด ๊ฒน์น  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ์ฒ˜๋ฆฌ
    if(nrx==nbx && nry==nby){
        // ์•„๋ž˜๋กœ ๋‚ด๋ ค๊ฐ„๊ฑฐ๋ผ๋ฉด ์œ„์—์žˆ๋˜๊ฑธ ํ•œ๋‹จ๊ณ„ ์ „์œผ๋กœ
        if (dir==0){
            if (bx<rx) nbx -= dx[dir];
            else nrx -= dx[dir];
        }
        // ์œ„๋กœ ์˜ฌ๋ผ๊ฐ„๊ฑฐ๋ผ๋ฉด ์•„๋ž˜์žˆ๋˜๊ฑธ ํ•œ๋‹จ๊ณ„ ์ „์œผ๋กœ
        else if (dir==1){
            if (bx>rx) nbx -= dx[dir];
            else nrx -= dx[dir];
        }
        // ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ„๊ฑฐ๋ผ๋ฉด ์™ผ์ชฝ์— ์žˆ๋˜๊ฑธ ํ•œ๋‹จ๊ณ„ ์ „์œผ๋กœ
        else if (dir==2){
            if (by<ry) nby -= dy[dir];
            else nry -= dy[dir];
        }
        // ์™ผ์ชฝ์œผ๋กœ ๊ฐ„๊ฑฐ๋ผ๋ฉด ์˜ค๋ฅธ์ชฝ์— ์žˆ๋˜๊ฑธ ํ•œ๋‹จ๊ณ„ ์ „์œผ๋กœ
        else if (dir==3){
            if (by>ry) nby -= dy[dir];
            else nry -= dy[dir];
        }
    }

    return {nrx, nry, nbx, nby};
}

int bfs(int start_rx, int start_ry, int start_bx, int start_by){
    
    // Red ์ขŒํ‘œ, Blue์ขŒํ‘œ, ๊ฑฐ๋ฆฌ
    queue<tuple<int,int,int,int,int>> q;
    q.push({start_rx, start_ry, start_bx, start_by, 0});
    visited[start_rx][start_ry][start_bx][start_by]=true;
    
    while (!q.empty()){
        auto [rx, ry, bx, by, now_dist] = q.front();

        // 10๋ฒˆ ์•ˆ์— ๋„์ฐฉ ๋ชปํ–ˆ์„ ๊ฒฝ์šฐ
        // 10๋„ ํฌํ•จํ•ด์•ผํ•˜๋Š” ์ด์œ  : ์ง€๊ธˆ๊นŒ์ง€ ์˜จ๊ฒŒ 10์ด๋ฉด,
        // ๋‹ค์Œ๋‹จ๊ณ„์— ๋„๋‹ฌํ•ด๋„ return์€ 11์ด ๋˜๊ธฐ ๋•Œ๋ฌธ์—
        if (now_dist>=10) {
            return -1;
        }

        q.pop();
        for (int i=0; i<4; i++){
            // ์ด๋™
            auto [nrx, nry, nbx, nby] = go(i, rx, ry, bx, by);

            // ํŒŒ๋ž€์ƒ‰์ด ๊ตฌ๋ฉ์— ๋น ์ง
            if (nbx==-2) continue;

            // ํŒŒ๋ž€์ƒ‰์€ ์•ˆ๋น ์ง€๊ณ  ๋นจ๊ฐ„์ƒ‰์ด ๊ตฌ๋ฉ์— ๋น ์ง€๋ฉด ์ข…๋ฃŒ
            if (nrx==-1) return now_dist+1;

            if (visited[nrx][nry][nbx][nby]) continue;
            visited[nrx][nry][nbx][nby] = true;
            q.push({nrx, nry, nbx, nby, now_dist + 1});
        }
    }
    return -1;  // ๋„๋‹ฌ ๋ชปํ–ˆ์„ ๊ฒฝ์šฐ
}

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0);
    
    cin >> N >> M;
    for (int i=0; i<N; i++){
        for (int j=0; j<M; j++){
            cin >> board[i][j];
        }
    }

    // ์‹œ์ž‘ ์ง€์  ์ฐพ๊ธฐ
    int rx, ry, bx, by;
    for (int i=0; i<N; i++)
        for (int j=0; j<M; j++)
            if (board[i][j]=='R'){
                rx = i; ry = j; break;
            }
    for (int i=0; i<N; i++)
        for (int j=0; j<M; j++)
            if (board[i][j]=='B'){
                bx = i; by = j; break;
            }

    cout << bfs(rx, ry, bx, by);
    
    return 0;
}

๐Ÿ’ก ๋งˆ๋ฌด๋ฆฌ

๋‚ด๊ฐ€ ํ’€๊ณ ๋„ ๋นจ๊ฐ„ ๊ณต๊ณผ ํŒŒ๋ž€ ๊ณต์ด ๋งŒ๋‚ ๋•Œ ์ฒ˜๋ฆฌ๋ฅผ ์ž˜ ํ•ด์ค€ ๊ฒƒ ๊ฐ™์•„์„œ ๋งŒ์กฑํ–ˆ๋‹ค.

์ด ์ฝ”๋“œ๋ฅผ ์กฐ๊ธˆ๋งŒ ์ˆ˜์ •ํ•ด๋„ ๊ตฌ์Šฌ ํƒˆ์ถœ 3, ๊ตฌ์Šฌ ํƒˆ์ถœ 4๋„ ์†์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค.