로봇 시뮬레이션 성공다국어
2 초 | 128 MB | 10559 | 2437 | 1883 | 22.769% |
문제
가로 A(1≤A≤100), 세로 B(1≤B≤100) 크기의 땅이 있다. 이 땅 위에 로봇들이 N(1≤N≤100)개 있다.

로봇들의 초기 위치는 x좌표와 y좌표로 나타난다. 위의 그림에서 보듯 x좌표는 왼쪽부터, y좌표는 아래쪽부터 순서가 매겨진다. 또한 각 로봇은 맨 처음에 NWES 중 하나의 방향을 향해 서 있다. 초기에 서 있는 로봇들의 위치는 서로 다르다.
이러한 로봇들에 M(1≤M≤100)개의 명령을 내리려고 한다. 각각의 명령은 순차적으로 실행된다. 즉, 하나의 명령을 한 로봇에서 내렸으면, 그 명령이 완수될 때까지 그 로봇과 다른 모든 로봇에게 다른 명령을 내릴 수 없다. 각각의 로봇에 대해 수행하는 명령은 다음의 세 가지가 있다.
- L: 로봇이 향하고 있는 방향을 기준으로 왼쪽으로 90도 회전한다.
- R: 로봇이 향하고 있는 방향을 기준으로 오른쪽으로 90도 회전한다.
- F: 로봇이 향하고 있는 방향을 기준으로 앞으로 한 칸 움직인다.
간혹 로봇들에게 내리는 명령이 잘못될 수도 있기 때문에, 당신은 로봇들에게 명령을 내리기 전에 한 번 시뮬레이션을 해 보면서 안전성을 검증하려 한다. 이를 도와주는 프로그램을 작성하시오.
잘못된 명령에는 다음의 두 가지가 있을 수 있다.
- Robot X crashes into the wall: X번 로봇이 벽에 충돌하는 경우이다. 즉, 주어진 땅의 밖으로 벗어나는 경우가 된다.
- Robot X crashes into robot Y: X번 로봇이 움직이다가 Y번 로봇에 충돌하는 경우이다.
입력
첫째 줄에 두 정수 A, B가 주어진다. 다음 줄에는 두 정수 N, M이 주어진다. 다음 N개의 줄에는 각 로봇의 초기 위치(x, y좌표 순) 및 방향이 주어진다. 다음 M개의 줄에는 각 명령이 명령을 내리는 순서대로 주어진다. 각각의 명령은 명령을 내리는 로봇, 명령의 종류(위에 나와 있는), 명령의 반복 회수로 나타낸다. 각 명령의 반복 회수는 1이상 100이하이다.
출력
첫째 줄에 시뮬레이션 결과를 출력한다. 문제가 없는 경우에는 OK를, 그 외의 경우에는 위의 형식대로 출력을 한다. 만약 충돌이 여러 번 발생하는 경우에는 가장 먼저 발생하는 충돌을 출력하면 된다.
예제 입력 1 복사
5 4
2 2
1 1 E
5 4 W
1 F 7
2 F 7
예제 출력 1 복사
Robot 1 crashes into the wall
//3 3
//1 9
//2 2 W
//1 F 1
//1 L 1
//1 F 1
//1 L 1
//1 F 2
//1 L 5
//1 F 2
//1 R 3
//1 F 2
//ok
//
//5 4
//2 2
//1 1 E
//5 4 W
//1 F 7
//2 F 7
//Robot 1 crashes into the wall//
//
//5 4
//2 4
//1 1 E
//5 4 W
//1 F 3
//2 F 1
//1 L 1
//1 F 3
//Robot 1 crashes into robot 2
//
//5 4
//2 2
//1 1 E
//5 4 W
//1 L 96
//1 F 2
//OK//
//
//5 4
//2 3
//1 1 E
//5 4 W
//1 F 4
//1 L 1
//1 F 20
//Robot 1 crashes into robot 2
//
TC 이거 다맞으면 어지간하면 맞지싶다.
코드
#include<iostream>
using namespace std;
struct info {
int num, x, y, dir;//cnt는 명령의 홋수
};
int Map[101][101];
info Robots[101];
int dx[4] = {-1,0,1,0};
int dy[4] = {0,-1,0,1};
//서북동남
int R, C;//가로,세로 맵 크기
int N, M;//로봇 개수, 명령개수
void simul() {
int num, cnt;
char cmd;
for (int i = 1; i <= M; i++) {
cin >> num >> cmd >> cnt;
for (int j = 0; j < cnt; j++) {
if (cmd == 'L') {
--Robots[num].dir;
if (Robots[num].dir < 0) {
Robots[num].dir = 3;
}
}
else if (cmd == 'R') {
++Robots[num].dir;
if (Robots[num].dir > 3) {
Robots[num].dir = 0;
}
}
else if (cmd == 'F') {
int x = Robots[num].x;
int y = Robots[num].y;
int nx = x + dx[Robots[num].dir];
int ny = y + dy[Robots[num].dir];
if (nx<1 || ny <1 || nx>C || ny > R) {
cout << "Robot " << num << " crashes into the wall";
return;
}
if (Map[ny][nx] > 0) {
cout << "Robot " << num << " crashes into robot " << Map[ny][nx];
return;
}
else if(Map[ny][nx]==0){
Map[ny][nx] = num;
Map[y][x] = 0;
Robots[num].x = nx, Robots[num].y = ny;
}
}
}
}
cout << "OK";
}
int main() {
cin >> C >> R;
cin >> N >> M;
int x, y;
char d;
for (int i = 1; i <= N; i++) {
cin >> x >> y >> d;
Robots[i].x = x, Robots[i].y = R-y+1;
Map[R - y + 1][x] = i;
if (d == 'W')
Robots[i].dir = 0;
else if (d == 'N')
Robots[i].dir = 1;
else if (d == 'E')
Robots[i].dir = 2;
else if (d == 'S')
Robots[i].dir = 3;
}
simul();
return 0;
}
'백준' 카테고리의 다른 글
백준1967 : 트리의 지름 (0) | 2022.05.16 |
---|---|
백준 1005: ACM Craft (0) | 2022.05.16 |
백준 6497 : 전력난 (0) | 2022.05.15 |
백준 1238: 파티 (0) | 2022.05.15 |
백준 1261:알고스팟 (0) | 2022.05.13 |