반응형

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

 

2174번: 로봇 시뮬레이션

첫째 줄에 두 정수 A, B가 주어진다. 다음 줄에는 두 정수 N, M이 주어진다. 다음 N개의 줄에는 각 로봇의 초기 위치(x, y좌표 순) 및 방향이 주어진다. 다음 M개의 줄에는 각 명령이 명령을 내리는 순

www.acmicpc.net

 

 

[ 문제풀이 ]

 

1. 각 로봇의 위치와 방향을 입력받고, arr 배열에 저장하고, m 배열을 만들어 각 좌표에 로봇이 있다면 해당 로봇의 번호로 초기화합니다.

 

2. 방향 전환 입력을 받으면 방향을 바꾸어주고, F 입력을 받으면 한 칸씩 움직이면서 해당 좌표에 다른 로봇이 있다면 충돌했다고 출력해 주고, 지도의 범위 벗어나면 벽과 추돌했다고 출력합니다.

 

3. 만약 충돌 없이 모든 명령을 수행했다면 OK를 출력합니다.

 

[ 소스코드 ]

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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include<iostream>
 
using namespace std;
 
struct robot {
    int y, x;
    int dir;
};
 
int A, B, N, M;
int m[101][101];
robot arr[101];
int dy[] = { 0,-1,0,1 };
int dx[] = { 1,0,-1,0 };
 
int move(int num, int re)
{
    int yy = arr[num].y;
    int xx = arr[num].x;
    int dir = arr[num].dir;
 
    m[yy][xx] = 0;
 
    for (int i = 0; i < re; i++) {
        yy += dy[dir];
        xx += dx[dir];
        if (yy > 0 && yy <= B && xx > 0 && xx <= A) {
            if (m[yy][xx] != num && m[yy][xx] != 0) {
                return m[yy][xx];
            }
        }
        else {
            return -1;
        }
    }
 
    m[yy][xx] = num;
    arr[num] = { yy,xx,dir };
 
    return 0;
}
 
int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);
 
    cin >> A >> B >> N >> M;
 
    for (int i = 1; i <= N; i++) {
        int x, y;
        char dir;
        cin >> x >> y >> dir;
        if (dir == 'E') {
            m[y][x] = i;
            arr[i] = { y,x,0 };
        }
        else if (dir == 'S') {
            m[y][x] = i;
            arr[i] = { y,x,1 };
        }
        else if (dir == 'W') {
            m[y][x] = i;
            arr[i] = { y,x,2 };
        }
        else {
            m[y][x] = i;
            arr[i] = { y,x,3 };
        }
    }
 
    while (M--) {
        int num, re;
        char cmd;
        cin >> num >> cmd >> re;
 
        if (cmd == 'F') {
            int n = move(num, re);
            if (n == -1) {
                cout << "Robot " << num << " crashes into the wall";
                return 0;
            }
            else if (n != 0) {
                cout << "Robot " << num << " crashes into robot " << n;
                return 0;
            }
        }
        else if (cmd == 'R') {
            arr[num].dir += re;
            arr[num].dir %= 4;
        }
        else {
            re %= 4;
            arr[num].dir -= re;
            arr[num].dir = (arr[num].dir + 4) % 4;
        }
    }
 
    cout << "OK";
}
cs
반응형

+ Recent posts