Back to Blog List

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

โ†Algorithm

๋ฌธ์ œ ์„ค๋ช…

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

Blog Image

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


์ด๋™ ํ•จ์ˆ˜

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

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

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

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

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

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

  • ์ฒ˜๋ฆฌ ๋ฐฉ๋ฒ•
  • ์•„๋ž˜ ์ƒํƒœ์—์„œ ์˜ค๋ฅธ์ชฝ์œผ๋กœ ๊ฐ„๋‹ค๊ณ  ํ•ด๋ณด์ž.
  • R . . . B . . #
  • ๊ทธ๋ƒฅ ์ด๋™์„ ํ•˜๋ฉด R๊ณผ B๊ฐ€ ๊ฐ™์€ ์œ„์น˜์— ์ฐํž ๊ฒƒ์ด๋‹ค.
  • . . . . . . (RB) #
  • ๊ฐ™์€ ์œ„์น˜๋ผ๋ฉด, ๋ฐฉํ–ฅ์— ๋”ฐ๋ผ์„œ ๋’ค๋”ฐ๋ผ์˜ค๋˜ ์• ๋ฅผ ํ•œ์นธ ์ „์œผ๋กœ ๋Œ๋ฆฌ๋ฉด ๋œ๋‹ค.
  • . . . . . R B #
cpp
// ์•„๋ž˜, ์œ„, ์˜ค๋ฅธ, ์™ผ 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 ์„ ๋ฆฌํ„ดํ•œ๋‹ค.

cpp
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; // ๋„๋‹ฌ ๋ชปํ–ˆ์„ ๊ฒฝ์šฐ }

๋‚ด ํ’€์ด

cpp
#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๋„ ์†์‰ฝ๊ฒŒ ํ’€ ์ˆ˜ ์žˆ๋‹ค.