본문 바로가기

code/BOJ

백준 1726 로봇

문제:

 

1726번: 로봇

많은 공장에서 로봇이 이용되고 있다. 우리 월드 공장의 로봇은 바라보는 방향으로 궤도를 따라 움직이며, 움직이는 방향은 동, 서, 남, 북 가운데 하나이다. 로봇의 이동을 제어하는 명령어는 다음과 같이 두 가지이다. 명령 1. Go k   - k는 1, 2 또는 3일 수 있다. 현재 향하고 있는 방향으로 k칸 만큼 움직인다. 명령 2. Turn dir   - dir은 left 또는 right 이며, 각각 왼쪽 또는 오른쪽으로 90° 회전한다. 공장 내 궤

www.acmicpc.net

코드:

/* 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;
}