반응형
출처: 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;
}
반응형
'PS 문제 풀이 > Baekjoon' 카테고리의 다른 글
[BOJ] 백준 2751 수 정렬하기 2 (0) | 2021.02.26 |
---|---|
[BOJ] 백준 2098 외판원 순회 (0) | 2021.02.26 |
[BOJ] 백준 1592 영식이와 친구들 (0) | 2021.02.26 |
[BOJ] 백준 1526 가장 큰 금민수 (0) | 2021.02.26 |
[BOJ] 백준 9517 아이 러브 크로아티아 (0) | 2021.02.26 |
댓글