본문 바로가기
PS 문제 풀이/Baekjoon

[BOJ] 백준 2174 로봇 시뮬레이션

by 까망 하르방 2021. 2. 26.
반응형

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

 Input 

5 4

2 2

1 1 E

5 4 W

1 F 7

2 F 7

 

 Output 

Robot 1 crashes into the wall

 

로봇의 위치와 방향을 아래와 같이 변경하여 표현

명령을 순차적으로 수행하므로, 명령을 수행하는 로봇의 위치에 따라 결과 출력.

- 로봇이 F 명령을 수행하면서, 범위밖인지 혹은 다른 로봇과 부딪혔는지 확인합니다.

- 방향을 바뀌는 경우, 4의 배수로 회전한다면 1바퀴를 회전하기 때문에 주어진 반복 횟수 % 4 처리합니다.

  그 후, 시계 및 반시계 방향에 따른 방향 전환 처리를 해줍니다.


#include <iostream>
#include <cstdio>
using namespace std;
typedef pair<int, int> XY;
typedef struct{
    int x, y;
    char dir;
    XY xy;
} Robot;
int map[101][101];
Robot robot[101];
int A, B, n, m;
 
int isRange(int x, int y){
    if (x < 1 || y < 1 || x > A || y > B)
        return -1;
    return 1;
}
 
int isCrash (int idx, int x, int y){
    for (int i = 1; i <= n; i++){
        if (i == idx) continue; // 자기 자신 제외
        if (robot[i].x == x && robot[i].y == y) return i;
    }
    return 0;
}
 
void turnLeft(int idx, int cnt){
    int x = robot[idx].xy.first;
    int y = robot[idx].xy.second;
    
    for (int j = 0; j < cnt; j++){
        if (x == 1 && y == 0) x = 0, y = 1;
        else if (x == 0 && y == 1) x = -1, y = 0;
        else if (x == -1, y == 0) x = 0, y = -1;
        else if (x == 0 && y == -1) x = 1, y = 0;
    }
 
    robot[idx].xy.first = x;
    robot[idx].xy.second = y;
}
 
void turnRight(int idx, int cnt){
    int x = robot[idx].xy.first;
    int y = robot[idx].xy.second;
    
    for (int j = 0; j < cnt; j++){
        if (x == 1 && y == 0) x = 0, y = -1;
        else if (x == 0 && y == -1) x = -1, y = 0;
        else if (x == -1, y == 0) x = 0, y = 1;
        else if (x == 0 && y == 1) x = 1, y = 0;
    }
 
    robot[idx].xy.first = x;
    robot[idx].xy.second = y;
}
 
int main(){
    cin >> A >> B >> n >> m;
    char direction;
    for (int i = 1; i <= n; i++){
        cin >> robot[i].x >> robot[i].y >> direction;
        
        if (direction == 'W') robot[i].xy = { -1, 0 };
        else if (direction == 'E') robot[i].xy = { 1, 0 };
        else if (direction == 'S') robot[i].xy = { 0, -1 };
        else if (direction == 'N') robot[i].xy = { 0, 1 };
    }
 
    while(m-- > 0){
        int idx, cnt; char order; 
         cin >> idx >> order >> cnt;
        if(order == 'F'){
            int x = robot[idx].xy.first;
            int y = robot[idx].xy.second;
 
            for (int j = 0; j < cnt; j++){
                robot[idx].x += x;
                robot[idx].y += y;
 
                if (isRange(robot[idx].x, robot[idx].y) == -1){
                    printf("Robot %d crashes into the wall\n", idx);
                    return 0;
                }
 
                int crash = isCrash(idx, robot[idx].x, robot[idx].y);
                if (crash){
                    printf("Robot %d crashes into robot %d\n", idx, crash);
                    return 0;
                }
            }
            continue;
        }
 
        // 4번 방향이 바꾸면 기존 방향이므로 continue
        if(cnt % 4 == 0) continue;
        if(order == 'L') turnLeft(idx, cnt % 4);
        else if(order == 'R') turnRight(idx, cnt % 4);    
    }
 
    cout << "OK" << endl;
}

 

반응형

댓글