BOJ 6087
๋ฌธ์
๋ ์ด์ ํต์ ์ฑ๊ณต๋ค๊ตญ์ด
๋ฌธ์
ํฌ๊ธฐ๊ฐ 1×1์ธ ์ ์ฌ๊ฐํ์ผ๋ก ๋๋์ด์ง W×H ํฌ๊ธฐ์ ์ง๋๊ฐ ์๋ค. ์ง๋์ ๊ฐ ์นธ์ ๋น ์นธ์ด๊ฑฐ๋ ๋ฒฝ์ด๋ฉฐ, ๋ ์นธ์ 'C'๋ก ํ์๋์ด ์๋ ์นธ์ด๋ค.
'C'๋ก ํ์๋์ด ์๋ ๋ ์นธ์ ๋ ์ด์ ๋ก ํต์ ํ๊ธฐ ์ํด์ ์ค์นํด์ผ ํ๋ ๊ฑฐ์ธ ๊ฐ์์ ์ต์๊ฐ์ ๊ตฌํ๋ ํ๋ก๊ทธ๋จ์ ์์ฑํ์์ค. ๋ ์ด์ ๋ก ํต์ ํ๋ค๋ ๊ฒ์ ๋ ์นธ์ ๋ ์ด์ ๋ก ์ฐ๊ฒฐํ ์ ์์์ ์๋ฏธํ๋ค.
๋ ์ด์ ๋ C์์๋ง ๋ฐ์ฌํ ์ ์๊ณ , ๋น ์นธ์ ๊ฑฐ์ธ('/', '\')์ ์ค์นํด์ ๋ฐฉํฅ์ 90๋ ํ์ ์ํฌ ์ ์๋ค.
์๋ ๊ทธ๋ฆผ์ H = 8, W = 7์ธ ๊ฒฝ์ฐ์ด๊ณ , ๋น ์นธ์ '.', ๋ฒฝ์ '*'๋ก ๋ํ๋๋ค. ์ผ์ชฝ์ ์ด๊ธฐ ์ํ, ์ค๋ฅธ์ชฝ์ ์ต์ ๊ฐ์์ ๊ฑฐ์ธ์ ์ฌ์ฉํด์ ๋ 'C'๋ฅผ ์ฐ๊ฒฐํ ๊ฒ์ด๋ค.
7 . . . . . . . 7 . . . . . . . 6 . . . . . . C 6 . . . . . /-C 5 . . . . . . * 5 . . . . . | * 4 * * * * * . * 4 * * * * * | * 3 . . . . * . . 3 . . . . * | . 2 . . . . * . . 2 . . . . * | . 1 . C . . * . . 1 . C . . * | . 0 . . . . . . . 0 . \-------/ . 0 1 2 3 4 5 6 0 1 2 3 4 5 6
์ ๋ ฅ
์ฒซ์งธ ์ค์ W์ H๊ฐ ์ฃผ์ด์ง๋ค. (1 ≤ W, H ≤ 100)
๋์งธ ์ค๋ถํฐ H๊ฐ์ ์ค์ ์ง๋๊ฐ ์ฃผ์ด์ง๋ค. ์ง๋์ ๊ฐ ๋ฌธ์๊ฐ ์๋ฏธํ๋ ๊ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
- .: ๋น ์นธ
- *: ๋ฒฝ
- C: ๋ ์ด์ ๋ก ์ฐ๊ฒฐํด์ผ ํ๋ ์นธ
'C'๋ ํญ์ ๋ ๊ฐ์ด๊ณ , ๋ ์ด์ ๋ก ์ฐ๊ฒฐํ ์ ์๋ ์ ๋ ฅ๋ง ์ฃผ์ด์ง๋ค.
์ถ๋ ฅ
์ฒซ์งธ ์ค์ C๋ฅผ ์ฐ๊ฒฐํ๊ธฐ ์ํด ์ค์นํด์ผ ํ๋ ๊ฑฐ์ธ ๊ฐ์์ ์ต์๊ฐ์ ์ถ๋ ฅํ๋ค.
ํ์ด
๊ทผ๋ ํผ ๋ฌธ์ ์ค์ ์ ์ผ๋ง์ด ํ๋ ธ๋ค.
์ต์๊ฐ์์ ๊ฑฐ์ธ ์ ๊ตฌํ๋ ๊ฒ์ด ๋ชฉํ์ด๊ณ ์ถ๋ฐ์ง์ ๋ชฉ์ ์ง์ ํด๋นํ๋ ์ขํ๊ฐ ์ ํด์ ธ ์๊ธฐ ๋๋ฌธ์ ๊ฑฐ์ธ์ ๊ฐ์๋ฅผ ๊ธฐ์ค์ผ๋กํ BFS๋ฅผ ์ฌ์ฉํ์ฌ ๋ฌธ์ ๋ฅผ ํ์๋ค.
๊ฑฐ์ธ์ ๊ฐ์๋ฅผ ๊ธฐ์ค์ผ๋ก ํ๊ธฐ ๋๋ฌธ์ ๊ฐ์ค์น๋ ํญ์ 0, 1์ด๋ค. ์ต๋จ๊ฑฐ๋ฆฌ์๋ ๊ด๊ณ๊ฐ ์์ด ๊ฑฐ์ธ์ ๊ฐ์ฅ ์ ๊ฒ ์ฌ์ฉํ ๊ฒฝ๋ก ๊ธฐ์ค ์ด๊ธฐ ๋๋ฌธ์ ๊ฐ๊ฐ์ ๊ฒฝ๋ก ๋ถ๋ถ์ ๋ฐฉํฅ์ ๋ณด๋ฅผ ๊ฐ์ด ์ ์ฅํ์ฌ ๋ฐฉํฅ์ด ๋ฐ๋์๋ค๋ฉด ๊ฑฐ์ธ์ ๊ฐ์ + 1์ ํด์ฃผ๋๋ก ํ์๋ค.
์ค๋ณต ๋ฐฉ๋ฌธ์ ๋ํด์๋ ์ฒดํฌํด์ฃผ์ด์ผ ํ๋๋ฐ ์ฌ๋ฐฉ๋ฌธ์์ ํด๋น ๋ ธ๋์ ํ์๋ ๋ฐฉํฅ์ ๋ณด, ๊ฑฐ์ธ์ ๊ฐ์ ๊ฐ ๊ฐ๋ค๋ฉด ๊ทธ ๋ ธ๋๋ ๋ค์ ๋ฐฉ๋ฌธํ์ง ์์๋ ๋๋ค.
์ฝ๋
#include <iostream>
#include <queue>
#include <algorithm>
#include <string>
#include <deque>
#define INTMAX 987654321
using namespace std;
int W, H, dx[4]={1,0,-1,0}, dy[4]={0,1,0,-1}, ans[101][101], dirList[101][101][4];
// ํ -> 0, ์ฐ -> 1, ์ -> 2, ์ข -> 3
vector<pair<int,int > > C;
string board[101];
int main(){
ios::sync_with_stdio(0);
cin.tie(0);
cin>>W>>H;
for(int i=0; i<H; i++)
cin>>board[i];
for(int i=0; i<H; i++){
for(int j=0; j<W; j++){
if(board[i][j] == 'C'){
C.push_back(make_pair(i,j));
}
ans[i][j] = INTMAX;
}
}
ans[C[0].first][C[0].second] = 0;
queue<pair<pair<int,int >,pair<int,int> > >q;
for(int i=0; i<4; i++) {
int nx = C[0].first+dx[i];
int ny = C[0].second+dy[i];
if(nx<0 || nx >= H || ny < 0 || ny >= W) continue;
if(board[nx][ny] == '*') continue;
ans[nx][ny] = 0;
dirList[nx][ny][i] = 1;
q.push(make_pair(make_pair(nx, ny), make_pair(i, 0)));
}
while(!q.empty()) {
auto cur = q.front(); q.pop();
for(int i=0; i<4; i++) {
int nx = cur.first.first + dx[i];
int ny = cur.first.second + dy[i];
int tmp = cur.second.second;
if(nx<0 || nx >= H || ny < 0 || ny >= W) continue;
if(board[nx][ny] == '*') continue;
if(i == cur.second.first && (i+2)%4 == cur.second.first) continue;
if(i != cur.second.first) tmp += 1;
if(ans[nx][ny] == tmp && dirList[nx][ny][i] == 1) continue;
if(ans[nx][ny] >= tmp) {
dirList[nx][ny][i] = 1;
ans[nx][ny] = tmp;
q.push(make_pair(make_pair(nx, ny), make_pair(i, tmp)));
}
}
}
cout<<ans[C[1].first][C[1].second];
}