상세 컨텐츠

본문 제목

2174. 로봇 시뮬레이션(C++) GOLD V

알고리즘/백준

by 아리따운노을 2020. 8. 18. 23:02

본문

문제

가로 A(1≤A≤100), 세로 B(1≤B≤100) 크기의 땅이 있다. 이 땅 위에 로봇들이 N(1≤N≤100)개 있다.

로봇들의 초기 위치는 x좌표와 y좌표로 나타난다. 위의 그림에서 보듯 x좌표는 왼쪽부터, y좌표는 아래쪽부터 순서가 매겨진다. 또한 각 로봇은 맨 처음에 NWES 중 하나의 방향을 향해 서 있다. 초기에 서 있는 로봇들의 위치는 서로 다르다.

이러한 로봇들에 M(1≤M≤100)개의 명령을 내리려고 한다. 각각의 명령은 순차적으로 실행된다. 즉, 하나의 명령을 한 로봇에서 내렸으면, 그 명령이 완수될 때까지 그 로봇과 다른 모든 로봇에게 다른 명령을 내릴 수 없다. 각각의 로봇에 대해 수행하는 명령은 다음의 세 가지가 있다.

  1. L: 로봇이 향하고 있는 방향을 기준으로 왼쪽으로 90도 회전한다.
  2. R: 로봇이 향하고 있는 방향을 기준으로 오른쪽으로 90도 회전한다.
  3. F: 로봇이 향하고 있는 방향을 기준으로 앞으로 한 칸 움직인다.

간혹 로봇들에게 내리는 명령이 잘못될 수도 있기 때문에, 당신은 로봇들에게 명령을 내리기 전에 한 번 시뮬레이션을 해 보면서 안전성을 검증하려 한다. 이를 도와주는 프로그램을 작성하시오.

잘못된 명령에는 다음의 두 가지가 있을 수 있다.

  1. Robot X crashes into the wall: X번 로봇이 벽에 충돌하는 경우이다. 즉, 주어진 땅의 밖으로 벗어나는 경우가 된다.
  2. Robot X crashes into robot Y: X번 로봇이 움직이다가 Y번 로봇에 충돌하는 경우이다.

입력

첫째 줄에 두 정수 A, B가 주어진다. 다음 줄에는 두 정수 N, M이 주어진다. 다음 N개의 줄에는 각 로봇의 초기 위치(x, y좌표 순) 및 방향이 주어진다. 다음 M개의 줄에는 각 명령이 명령을 내리는 순서대로 주어진다. 각각의 명령은 명령을 내리는 로봇, 명령의 종류(위에 나와 있는), 명령의 반복 회수로 나타낸다. 각 명령의 반복 회수는 1이상 100이하이다.

출력

첫째 줄에 시뮬레이션 결과를 출력한다. 문제가 없는 경우에는 OK를, 그 외의 경우에는 위의 형식대로 출력을 한다. 만약 충돌이 여러 번 발생하는 경우에는 가장 먼저 발생하는 충돌을 출력하면 된다.

그래프 그려져있길래 bfs나 dfs문제인 줄 알았는데 그냥 구현 문제다

처음에는 원래 테이블의 모양대로 그림을 돌리려고 했지만 그림 그대로
돌리지 않고 그대로 해도 괜찮을 것이라 판단해 그냥 했다.
N,E,W,S를 각각 방향에 맞게 설정했다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <bits/stdc++.h>
 
using namespace std;
 
class Robot{
public:
    int x, y, dir;
};
int A,B,N,M;
int mx[] ={0,1,0,-1}, my[] = {1,0,-1,0};
Robot robot[101];
 
 
bool operate(int idx, char opt)
{
    switch(opt)
    {
    case 'L':
        robot[idx].dir = (robot[idx].dir + 4 - 1 ) % 4;
        break;
    case 'R':
        robot[idx].dir = (robot[idx].dir + 1 ) % 4;
        break;
    case 'F':
        robot[idx].x += mx[robot[idx].dir];
        robot[idx].y += my[robot[idx].dir];
        if(robot[idx].x < 1 || robot[idx].x > A || robot[idx].y < 1 || robot[idx].y > B)
        {
            cout<<"Robot "<<idx<<" crashes into the wall\n";
            return false;
        }
        for(int i=1;i<=N;i++)
        {
            if(i == idx) continue;
 
            if(robot[i].x == robot[idx].x && robot[i].y == robot[idx].y)
            {
                cout<<"Robot "<<idx<<" crashes into robot "<<i;
                return false;
            }
        }
        break;
    }
 
    return true;
}
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin>>A>>B;
    cin>>N>>M;
    char dir, opt;
    for(int i=1;i<=N;i++)
    {
        cin>>robot[i].x>>robot[i].y>>dir;
        switch(dir)
        {
        case 'D':
            robot[i].dir = 0;
            break;
        case 'E':
            robot[i].dir = 1;
            break;
        case 'S':
            robot[i].dir = 2;
            break;
        case 'W':
            robot[i].dir = 3;
            break;
        }
    }
    int idx,repeat;
    for(int i=0;i<M;i++)
    {
        cin>>idx>>opt>>repeat;
        while(repeat--)
        {
            if(!operate(idx, opt)) return 0;
        }
 
    }
    cout<<"OK";
    return 0;
}
 
cs

repeat 횟수에 맞춰 해당 동작을 동작하다가 충돌 하면 에러 메시지를 출력하고 중단하면 된다.

 

'알고리즘 > 백준' 카테고리의 다른 글

17140. ⚾ (C++) GOLD IV  (0) 2020.08.18
14891. 톱니바퀴(C++) SILVER I  (0) 2020.08.18
17140. 이차원 배열과 연산 GOLD IV (C++)  (0) 2020.08.08
스타트 택시(C++) - GOLD V  (1) 2020.07.20
16234. 인구 이동 GOLD V(C++)  (0) 2020.06.10

관련글 더보기

댓글 영역