※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※

 

이번에 볼 문제는 백준 13901번 문제인 로봇이다.
문제는 아래 링크를 확인하자.

https://www.acmicpc.net/problem/13901 

 

13901번: 로봇

첫 번째 줄에는 방의 크기 R, C(3 ≤ R, C ≤ 1,000)가 입력된다. 두 번째 줄에는 장애물의 개수 k(0 ≤ k ≤ 1,000)가 입력된다. 다음 k개의 줄에는 각 장애물 위치 br(0 ≤ br ≤ R – 1), bc(0 ≤ bc ≤ C - 1)가

www.acmicpc.net

주어진 로봇의 움직임을 시뮬레이션하는 구현문제이다.

 

현재 진행방향을 기억하고, 각 칸으로 이동할 수 있는지(즉, 벽이 있거나 이미 방문한 칸인지)를 기록해두는 배열을 만들어 시뮬레이션을 돌리는 코드를 작성하자.

 

가능한 방향을 모두 살펴보았는지를 살피는 것은 다음 방향을 확인해나가면서 특정(아래의 코드에서는 네 번째) 방향을 두번 체크했는지를 확인하는 것으로 간단히 구현할 수 있다. 위와 같이 구현했을 때 같은 방향을 다시 살피는 경우는 더 이상 이동할 수 없을 때 마지막 한번만 발생하므로 시간상 손해가 거의 없다는 점을 관찰하자.

 

아래는 제출한 소스코드이다.

#include <iostream>
using namespace std;

int R, C, K, r, c;
bool board[1000][1000];
int dr[4], dc[4];

void solve() {
	int idx = 0;
	board[r][c] = 1;
	while (1) {
		bool chk = 0;
		while (idx < 4) {
			int rr = r + dr[idx], cc = c + dc[idx];
			if (rr < 0 || rr >= R || cc < 0 || cc >= C || board[rr][cc]) {
				idx++;
				continue;
			}
			board[rr][cc] = 1;
			r = rr, c = cc;
			chk = 1;
			break;
		}
		if (chk) continue;
		idx = 0;
		while (idx < 4) {
			int rr = r + dr[idx], cc = c + dc[idx];
			if (rr < 0 || rr >= R || cc < 0 || cc >= C || board[rr][cc]) {
				idx++;
				continue;
			}
			board[rr][cc] = 1;
			r = rr, c = cc;
			chk = 1;
			break;
		}
		if (chk) continue;
		break;
	}
}

int main() {
	ios::sync_with_stdio(0);
	cin.tie(0);

	cin >> R >> C >> K;
	while (K--) {
		int rr, cc; cin >> rr >> cc;
		board[rr][cc] = 1;
	}
	cin >> r >> c;

	for (int i = 0; i < 4; i++) {
		int x; cin >> x;
		if (x == 1) dr[i] = -1;
		else if (x == 2) dr[i] = 1;
		else if (x == 3) dc[i] = -1;
		else dc[i] = 1;
	}

	solve();

	cout << r << ' ' << c;
}
728x90

'BOJ' 카테고리의 다른 글

[BOJ 13905 // C++] 세부  (0) 2023.03.29
[BOJ 13902 // C++] 개업 2  (0) 2023.03.28
[BOJ 13912 // C++] 외계 생물  (0) 2023.03.26
[BOJ 13911 // C++] 집 구하기  (0) 2023.03.25
[BOJ 13903 // C++] 출근  (0) 2023.03.24

+ Recent posts