문제:
코드:
/* 1. 문제는 좌표 1부터 시작, 나는 0부터 시작 -> 조정 필요 */
/* 2. 궤도를 따라 움직이므로, 중간에 끊기면 더 이상 앞으로 나아갈 수 없다. */
#include <iostream>
#include <queue>
#define f(i, n) for(int i = 0; i < (n); ++i)
using namespace std;
typedef pair<int, int> p;
int R, C;
int rb, cb, db, re, ce, de;
bool map[100][100];
bool vst[100][100][4];
struct qnode {
int r, c, d;
};
int dr[] = { 0, 0, 1, -1 };
int dc[] = { 1, -1, 0, 0 };
int nd[4][2] = {{3, 2}, {2, 3}, {0, 1}, {1, 0}}; // 기존 d, left/right
#define IN(r, c) (0 <= (r) && (r) < R && 0 <= (c) && (c) < C)
int main() {
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
cin >> R >> C;
f(r, R) f(c, C) cin >> map[r][c];
cin >> rb >> cb >> db >> re >> ce >> de;
--rb, --cb, --db, --re, --ce, --de; /* 1 */
vst[rb][cb][db] = 1;
queue<qnode> q;
q.push({rb, cb, db});
int t = 0;
while (!q.empty()) {
int qs = q.size();
while (qs--) {
qnode pt = q.front(); q.pop();
if (pt.r == re && pt.c == ce && pt.d == de)
goto out;
int nr = pt.r, nc = pt.c; // go
for (int k = 1; k <= 3; ++k) {
nr += dr[pt.d], nc += dc[pt.d];
if (IN(nr, nc)) {
if (!map[nr][nc]) {
if (!vst[nr][nc][pt.d]) {
vst[nr][nc][pt.d] = 1;
q.push({ nr, nc, pt.d });
}
}
else break; /* 2 */
}
else break; /* 2 */
}
f(dir, 2) // turn
if (!vst[pt.r][pt.c][nd[pt.d][dir]]) {
vst[pt.r][pt.c][nd[pt.d][dir]] = 1;
q.push({ pt.r, pt.c, nd[pt.d][dir] });
}
}
++t;
}
out:
cout << t;
return 0;
}