BOJ 13460. ๊ตฌ์ฌ ํ์ถ 2
๐โโ๏ธ[Gold I] ๊ตฌ์ฌ ํ์ถ 2 - 13460
์ฑ๋ฅ ์์ฝ
๋ฉ๋ชจ๋ฆฌ: 2040 KB, ์๊ฐ: 0 ms
๋ถ๋ฅ
๋๋น ์ฐ์ ํ์, ๊ทธ๋ํ ์ด๋ก , ๊ทธ๋ํ ํ์, ๊ตฌํ, ์๋ฎฌ๋ ์ด์
์ ์ถ ์ผ์
2024๋ 2์ 6์ผ 14:33:50
๋ฌธ์ ์ค๋ช
์คํํธ๋งํฌ์์ ํ๋งคํ๋ ์ด๋ฆฐ์ด์ฉ ์ฅ๋๊ฐ ์ค์์ ๊ฐ์ฅ ์ธ๊ธฐ๊ฐ ๋ง์ ์ ํ์ ๊ตฌ์ฌ ํ์ถ์ด๋ค. ๊ตฌ์ฌ ํ์ถ์ ์ง์ฌ๊ฐํ ๋ณด๋์ ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํ๋์ฉ ๋ฃ์ ๋ค์, ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ด๋ ๊ฒ์์ด๋ค.
๋ณด๋์ ์ธ๋ก ํฌ๊ธฐ๋ N, ๊ฐ๋ก ํฌ๊ธฐ๋ M์ด๊ณ , ํธ์์ 1ร1ํฌ๊ธฐ์ ์นธ์ผ๋ก ๋๋์ด์ ธ ์๋ค. ๊ฐ์ฅ ๋ฐ๊นฅ ํ๊ณผ ์ด์ ๋ชจ๋ ๋งํ์ ธ ์๊ณ , ๋ณด๋์๋ ๊ตฌ๋ฉ์ด ํ๋ ์๋ค. ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํฌ๊ธฐ๋ ๋ณด๋์์ 1ร1ํฌ๊ธฐ์ ์นธ์ ๊ฐ๋ ์ฑ์ฐ๋ ์ฌ์ด์ฆ์ด๊ณ , ๊ฐ๊ฐ ํ๋์ฉ ๋ค์ด๊ฐ ์๋ค. ๊ฒ์์ ๋ชฉํ๋ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด์ ๋นผ๋ด๋ ๊ฒ์ด๋ค. ์ด๋, ํ๋ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ๋ฉด ์ ๋๋ค.
์ด๋, ๊ตฌ์ฌ์ ์์ผ๋ก ๊ฑด๋๋ฆด ์๋ ์๊ณ , ์ค๋ ฅ์ ์ด์ฉํด์ ์ด๋ฆฌ ์ ๋ฆฌ ๊ตด๋ ค์ผ ํ๋ค. ์ผ์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ, ์ค๋ฅธ์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ, ์์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ, ์๋์ชฝ์ผ๋ก ๊ธฐ์ธ์ด๊ธฐ์ ๊ฐ์ ๋ค ๊ฐ์ง ๋์์ด ๊ฐ๋ฅํ๋ค.
๊ฐ๊ฐ์ ๋์์์ ๊ณต์ ๋์์ ์์ง์ธ๋ค. ๋นจ๊ฐ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋น ์ง๋ฉด ์ฑ๊ณต์ด์ง๋ง, ํ๋ ๊ตฌ์ฌ์ด ๊ตฌ๋ฉ์ ๋น ์ง๋ฉด ์คํจ์ด๋ค. ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ด ๋์์ ๊ตฌ๋ฉ์ ๋น ์ ธ๋ ์คํจ์ด๋ค. ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ๋์์ ๊ฐ์ ์นธ์ ์์ ์ ์๋ค. ๋, ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํฌ๊ธฐ๋ ํ ์นธ์ ๋ชจ๋ ์ฐจ์งํ๋ค. ๊ธฐ์ธ์ด๋ ๋์์ ๊ทธ๋งํ๋ ๊ฒ์ ๋ ์ด์ ๊ตฌ์ฌ์ด ์์ง์ด์ง ์์ ๋ ๊น์ง์ด๋ค.
๋ณด๋์ ์ํ๊ฐ ์ฃผ์ด์ก์ ๋, ์ต์ ๋ช ๋ฒ ๋ง์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ผ ์ ์๋์ง ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค.
์ ๋ ฅ
์ฒซ ๋ฒ์งธ ์ค์๋ ๋ณด๋์ ์ธ๋ก, ๊ฐ๋ก ํฌ๊ธฐ๋ฅผ ์๋ฏธํ๋ ๋ ์ ์ N, M (3 โค N, M โค 10)์ด ์ฃผ์ด์ง๋ค. ๋ค์ N๊ฐ์ ์ค์ ๋ณด๋์ ๋ชจ์์ ๋ํ๋ด๋ ๊ธธ์ด M์ ๋ฌธ์์ด์ด ์ฃผ์ด์ง๋ค. ์ด ๋ฌธ์์ด์ '.
', '#
', 'O
', 'R
', 'B
' ๋ก ์ด๋ฃจ์ด์ ธ ์๋ค. '.
'์ ๋น ์นธ์ ์๋ฏธํ๊ณ , '#
'์ ๊ณต์ด ์ด๋ํ ์ ์๋ ์ฅ์ ๋ฌผ ๋๋ ๋ฒฝ์ ์๋ฏธํ๋ฉฐ, 'O
'๋ ๊ตฌ๋ฉ์ ์์น๋ฅผ ์๋ฏธํ๋ค. 'R
'์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ์์น, 'B
'๋ ํ๋ ๊ตฌ์ฌ์ ์์น์ด๋ค.
์
๋ ฅ๋๋ ๋ชจ๋ ๋ณด๋์ ๊ฐ์ฅ์๋ฆฌ์๋ ๋ชจ๋ '#
'์ด ์๋ค. ๊ตฌ๋ฉ์ ๊ฐ์๋ ํ ๊ฐ ์ด๋ฉฐ, ๋นจ๊ฐ ๊ตฌ์ฌ๊ณผ ํ๋ ๊ตฌ์ฌ์ ํญ์ 1๊ฐ๊ฐ ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ต์ ๋ช ๋ฒ ๋ง์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ผ ์ ์๋์ง ์ถ๋ ฅํ๋ค. ๋ง์ฝ, 10๋ฒ ์ดํ๋ก ์์ง์ฌ์ ๋นจ๊ฐ ๊ตฌ์ฌ์ ๊ตฌ๋ฉ์ ํตํด ๋นผ๋ผ ์ ์์ผ๋ฉด -1์ ์ถ๋ ฅํ๋ค.
๐ํ์ด
๋ ์๊ฐ์ ์ฌ์ฉํ๊ณ ํ์ง๋ชปํ ๋ฌธ์ ์ด๋คโฆ..
๋ค๋ฅธ ๋ธ๋ก๊ทธ ๊ทธ๋๋ก ์ด์ฉํจ.. ใ ;;
BFS ๋ฌธ์ ์ด๊ณ ๋ฌธ์ ์ ์กฐ๊ฑด๋ค์ ๋ค ์ฒดํฌํด์ผํ๋ค.
๊ณต์ด ์์ง์ด๋ ๊ฒ์ move
ํจ์๋ฅผ ์ด์ฉํ๋ค.
void move(int& rx, int& ry, int& distance, int& i)
{
while (map[rx + dx[i]][ry + dy[i]] != '#' && map[rx][ry] != 'O')
{
rx += dx[i];
ry += dy[i];
distance += 1;
}
}
์ด ๋ ๊ณต์ด ์์ง์ธ ํ์๊น์ง ์ฒดํฌํ๋๋ฐ ์ด๋ ๊ณต์ด ๊ณ์ณค์ ๋ ๋ ๋ง์ด ์์ง์ธ ๊ณต์ด ๋๋์๊ฐ์ผํ๊ธฐ ๋๋ฌธ์ด๋ค.
BFS์ด๋ฏ๋ก queue
๋ฅผ ๋ง๋๋๋ฐ step ๊ตฌ์กฐ์ฒด๋ฅผ ๊ด๋ฆฌํ๋ค.
struct step
{
int Rx, Ry;
int Bx, By;
int Count;
};
Count๊ฐ ์ด ์์ง์ด ํ์์ด๋ค.
BFS
void BFS(int Rx, int Ry, int Bx, int By)
{
queue<step> q;
q.push({ Rx,Ry,Bx,By,0 });
visit[Rx][Ry][Rx][Ry] = true;
while (!q.empty())
{
int rx = q.front().Rx;
int ry = q.front().Ry;
int bx = q.front().Bx;
int by = q.front().By;
int count = q.front().Count;
q.pop();
if (count >= 10) break;
for (int i = 0; i < 4; i++)
{
int nrx = rx, nry = ry, nbx = bx, nby = by;
int rc = 0, bc = 0, ncount = count + 1;
move(nrx, nry, rc, i);
move(nbx, nby, bc, i);
if (map[nbx][nby] == 'O') continue;
if (map[nrx][nry] == 'O')
{
cout << ncount;
return;
}
if (nrx == nbx && nry == nby)
{
if (rc > bc) nrx -= dx[i], nry -= dy[i];
else nbx -= dx[i], nby -= dy[i];
}
if (visit[nrx][nry][nbx][nby]) continue;
visit[nrx][nry][nbx][nby] = true;
q.push({ nrx,nry,nbx,nby,ncount });
}
}
cout << -1;
}
๋ฐฉ๋ฌธ ํ์ธ visited๋ 4์ฐจ์๋ฐฐ์ด๋ก ๋นจ๊ฐ๊ณต ํ๋๊ณต ๋ ๊ฐ๋ฅผ ํ์ธํ๋ค.
ํ๋๊ณต์ด ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ๋ ๊ฒฝ์ฐ๋ ๋์ด๊ฐ๋ค.
๋นจ๊ฐ๊ณต์ด ๊ตฌ๋ฉ์ ๋ค์ด๊ฐ๋ฉด ์์ง์ธ ํ์๋ฅผ ์ถ๋ ฅํ๊ณ ๋๋ธ๋ค.
์์ง์ธ ํ์๊ฐ 10 ์ด์์ด๋ฉด ๊ทธ๋ฅ ๋๋ธ๋ค.
๋นจ๊ฐ๊ณต๊ณผ ํ๋๊ณต์ด ๊ฐ์ ๊ณณ์ด๋ฉด ๋ ๋ง์ด ์์ง์ธ ๊ณต์ด ๊ทธ ํ ์นธ ์ ์ผ๋ก ๋๋์๊ฐ๋ค.
๊ฐ์ ํ๋์ ๋ฐ๋ณต ์ํ๊ธฐ ์ํด์ ๋ฐฉ๋ฌธํ ๊ณณ์ ๋์ด๊ฐ๋ค.
void solve()
{
cin >> N >> M;
int Rx = 0, Ry = 0, Bx = 0, By = 0;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
cin >> map[i][j];
if (map[i][j] == 'R')
{
Rx = i; Ry = j;
}
else if (map[i][j] == 'B')
{
Bx = i; By = j;
}
}
}
BFS(Rx, Ry, Bx, By);
}
solveํจ์๋ ์ด๋ ๊ฒ ํด์ ์ฒ์ ๋นจ๊ฐ๊ณต๊ณผ ํ๋๊ณต์ ์์น๋ฅผ ๊ธฐ์ตํด์ค๋ค.
๊ทธ ํ BFS๋ฅผ ๋๋ฆฌ๋ฉด ๋!
๐์ ์ฒด ์ฝ๋
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include<iostream>
#include <fstream>
#include <vector>
#include <algorithm>
#include <queue>
using namespace std;
struct step
{
int Rx, Ry;
int Bx, By;
int Count;
};
char map[11][11];
bool visit[11][11][11][11];
int N, M;
int dx[] = { 1,-1,0,0 };
int dy[] = { 0,0,1,-1 };
void move(int& rx, int& ry, int& distance, int& i)
{
while (map[rx + dx[i]][ry + dy[i]] != '#' && map[rx][ry] != 'O')
{
rx += dx[i];
ry += dy[i];
distance += 1;
}
}
void BFS(int Rx, int Ry, int Bx, int By)
{
queue<step> q;
q.push({ Rx,Ry,Bx,By,0 });
visit[Rx][Ry][Rx][Ry] = true;
while (!q.empty())
{
int rx = q.front().Rx;
int ry = q.front().Ry;
int bx = q.front().Bx;
int by = q.front().By;
int count = q.front().Count;
q.pop();
if (count >= 10) break;
for (int i = 0; i < 4; i++)
{
int nrx = rx, nry = ry, nbx = bx, nby = by;
int rc = 0, bc = 0, ncount = count + 1;
move(nrx, nry, rc, i);
move(nbx, nby, bc, i);
if (map[nbx][nby] == 'O') continue;
if (map[nrx][nry] == 'O')
{
cout << ncount;
return;
}
if (nrx == nbx && nry == nby)
{
if (rc > bc) nrx -= dx[i], nry -= dy[i];
else nbx -= dx[i], nby -= dy[i];
}
if (visit[nrx][nry][nbx][nby]) continue;
visit[nrx][nry][nbx][nby] = true;
q.push({ nrx,nry,nbx,nby,ncount });
}
}
cout << -1;
}
void solve()
{
cin >> N >> M;
int Rx = 0, Ry = 0, Bx = 0, By = 0;
for (int i = 0; i < N; i++)
{
for (int j = 0; j < M; j++)
{
cin >> map[i][j];
if (map[i][j] == 'R')
{
Rx = i; Ry = j;
}
else if (map[i][j] == 'B')
{
Bx = i; By = j;
}
}
}
BFS(Rx, Ry, Bx, By);
}
int main()
{
ios_base::sync_with_stdio(false);
cin.tie(NULL); cout.tie(NULL);
//freopen("input.txt", "rt", stdin);
solve();
return 0;
}