백준 2174(로봇 시뮬레이션)
이 문제는 로봇들이 이동하면서 충돌이 없보토이 움직일 수 있느냐를 구하는 문제였다.
이 문제에서 가장 실수를 많이 할 수 있는 부분은 땅의 인덱스였던 것 같다.
보통의 배열이라면 왼쪽 위에 (1, 1)이 위치해 있는데 이 문제에서는 왼쪽 아래에 (1, 1)이 위치해 있다.
이 부분은 같이 스터디 하는 분들도 헷갈렸다고 할 정도로 신경을 써서 구현을 해야 한다.
우선 이 문제를 해결하기 위해 입력값을 저장해보도록 하자.
나는 배열에 문자가 들어가는 것을 좋아하지 않기 떄문에 decide_direction()이라는 함수를 이용해서 E, N, W, S를 0, 1, 2, 3의 값으로 변경해서 각 로봇마다 방향을 지정해주었다.
이때 방향을 정하는 구조체인 Dir의 dir객체를 보면 {0, 1}, {-1, 0}, {0, -1}, {1, 0)의 순으로 저장이 되어 있는데 이는 E, N, W, S의 방향과 같다. (방향이 헷갈리지 않게 로봇의 방향과 구조체의 방향을 모두 E는 0, N은 1, W는 2, S는 3으로 맞춰주었다.)
그리고 입력을 마친 로봇은 map배열의 지정된 x, y좌표에 로봇의 번호를 값으로 가지고 저장되게 된다.
다음으로는 move함수이다.
만약 F를 입력하게 되면 move_forward()라는 함수를 이용해서 내가 바라보는 방향으로 한칸을 전진하도록 했다.(로봇이 바라보는 방향과 dir의 인덱스를 같게 한 이유가 여기에 있다.)
한칸을 전진한 후의 위치에(map 배열에) 다른 로봇이 있다면 충돌이 났다는 문자를 출력해주고 프로그램은 끝이 나게 된다.
혹은 벽이 있을 때도 해당 문자열을 출력하고 프로그램이 끝이 나게 된다.
다음으로 만약 L, R가 들어오게 되면 아래 코드에서 볼 수 있듯이 방향을 바꿔주도록 했다.
만약 이렇게 모든 입력이 끝이 날때까지 충돌이 나지 않는다면 OK를 출력하고 끝이 나게 된다.
#include<iostream>
#include<vector>
using namespace std;
int A, B, N, M;
int map[101][101] = { 0, };
struct Robot {
int y, x, d;
};
struct Dir {
int y, x;
};
Robot robot[101];
Dir dir[4] = { {0, 1}, {-1, 0}, {0, -1}, {1, 0} }; //E N W S
void decide_direction(int num, char c) {
if (c == 'E')
robot[num].d = 0;
else if (c == 'N')
robot[num].d = 1;
else if (c == 'W')
robot[num].d = 2;
else if (c == 'S')
robot[num].d = 3;
}
void move_forward(int num) {
robot[num].y += dir[robot[num].d].y;
robot[num].x += dir[robot[num].d].x;
}
bool move(int num, char d, int cnt) {
if (d == 'F') {
map[robot[num].y][robot[num].x] = 0;
for (int i = 0; i < cnt; i++) {
move_forward(num);
if (map[robot[num].y][robot[num].x]) {
cout << "Robot " << num << " crashes into robot " << map[robot[num].y][robot[num].x] << endl;
return false;
}
else if (robot[num].y < 1 || robot[num].y > B || robot[num].x < 1 || robot[num].x > A) {
cout << "Robot " << num << " crashes into the wall\n";
return false;
}
}
map[robot[num].y][robot[num].x] = num;
}
else if (d == 'R') {
cnt %= 4;
robot[num].d += 4 - cnt;
robot[num].d %= 4;
}
else if (d == 'L') {
robot[num].d += cnt;
robot[num].d %= 4;
}
return true;
}
int main(void) {
cin.tie(NULL);
ios::sync_with_stdio(false);
cin >> A >> B >> N >> M;
int y, x, num, cnt;
char d;
for (int i = 1; i <= N; i++) {
cin >> x >> y >> d;
robot[i].y = B - y + 1;
robot[i].x = x;
decide_direction(i, d);
map[B - y + 1][x] = i;
}
for (int i = 0; i < M; i++) {
cin >> num >> d >> cnt;
if (!move(num, d, cnt)) {
break;
}
else if (i == M - 1)
cout << "OK\n";
}
return 0;
}