https://www.acmicpc.net/problem/1726
3차원 큐와 배열을 능숙히 사용하실 줄 알면 충분히 푸실 수 있는 문제입니다.
저는 BFS를 사용하여 문제를 해결했고, 기존에 좌표만 생각하던 BFS문제처럼
방향과 전진크기를 고려하면서 BFS를 돌리면 쉽게 해결하실 수 있습니다.
ch[방향][x][y], 큐({방향,x,y})를 사용했습니다.
#include <iostream>
#include <queue>
using namespace std;
int m, n,map[101][101];
bool ch[4][101][101];
int sx, sy, sdir;//start
int ax, ay, adir;//arrive
int dx[] = { 0,0,0,1,-1 };
int dy[] = { 0,1,-1,0,0 };
struct Info {
int dir;
int x;
int y;
};
queue <Info> q;
void bfs() {
int cnt = 0;
while (!q.empty()) {
int size = q.size();//큐 크기만큼만 돌려줘서 depth 계산
cnt++;
for (int i = 0; i < size; i++) {
int x = q.front().x;
int y = q.front().y;
int dir = q.front().dir;
q.pop();
if (x == ax && y == ay && dir == adir) {//도착
cout << cnt-1;
return;
}
int nx = x;
int ny = y;
for (int j = 0; j < 3; j++) {//전진
nx += dx[dir];
ny += dy[dir];
if (nx > 0 && ny > 0 && nx <= m&&ny <= n && !ch[dir][nx][ny]) {
if (map[nx][ny] == 1) break;
ch[dir][nx][ny] = true;
q.push({ dir,nx,ny });
}
}
if (dir == 1 || dir == 2) {//동or서->남북
if (!ch[3][x][y]) {
q.push({ 3,x,y });
ch[3][x][y] = true;
}
if (!ch[4][x][y]) {
q.push({ 4,x,y });
ch[4][x][y] = true;
}
}
else if (dir == 3 || dir == 4) {//남or북->동서
if (!ch[1][x][y]) {
q.push({ 1,x,y });
ch[1][x][y] = true;
}
if (!ch[2][x][y]) {
q.push({ 2,x,y });
ch[2][x][y] = true;
}
}
}
}
}
int main() {
ios::sync_with_stdio(0);
cin.tie(0);
cin >> m >> n;
for (int i = 1; i <= m; i++) {
for (int j = 1; j <= n; j++) {
cin >> map[i][j];
}
}
cin >> sx >> sy >> sdir;
cin >> ax >> ay >> adir;
q.push({ sdir, sx, sy });//시작위치저장
ch[sdir][sx][sy] = true;
bfs();
}
- 나 혼자 말하고 나 혼자 듣는 말
….