※ 글쓴이는 취미로 코딩을 익혀보는 사람이라 정확하지 않은 내용을 담고 있을 수 있다 ※
이번에 볼 문제는 백준 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 |