티스토리 뷰
아주 열심히 구현하면 되는 문제였습니다.
로봇의 위치가 주어지고, 각 로봇별 움직임이 주어졌을 때, 해당 로봇이 충돌하냐 안 하냐 구하는 문제입니다.
로봇이 충돌하는 경우는 아래의 2가지 경우입니다.
1. 벽에 부딛힌다.
2. 다른 로봇에 부딛힌다.
1번 경우 : 로봇이 F 명령을 받았을 때 맵을 벗어나면 그렇습니다.
2번 경우 : 로봇이 F 명령을 받았을 때 맵에 다른 로봇이 있을 때 입니다.
이를 모든 경우에 대해 다 통과하면 OK 입니다.
코드는 다음과 같습니다.
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
using namespace std;
struct info {
int x; // 로봇의 x좌표
int y; // 로봇의 y좌표
int num; // 로봇의 번호
char dir; // 로봇의 방향
}; // 로봇 정보 구조체
int A, B;
int N, M;
info robot[101]; // i번 로봇 정보 : 현재 위치(x,y), 방향(dir)
int map[101][101]; // x,y 에 num 로봇 존재
bool check; // 진행 가능 여부
// 벽에 부딛히는 경우
void crash_wall(int num)
{
cout << "Robot " << num << " crashes into the wall";
return;
}
// 다른 로봇에 부딛히는 경우 (num1이 움직이고 있는 로봇)
void crash_robot(int num1, int num2)
{
cout << "Robot " << num1 << " crashes into robot " << num2;
return;
}
// 성공
void success()
{
cout << "OK";
return;
}
// r 로봇이 왼쪽으로 회전
void left(info& r)
{
if (r.dir == 'N') {
r.dir = 'W';
}
else if (r.dir == 'W') {
r.dir = 'S';
}
else if (r.dir == 'S') {
r.dir = 'E';
}
else if (r.dir == 'E') {
r.dir = 'N';
}
return;
}
// r 로봇이 오른쪽으로 회전
void right(info& r)
{
if (r.dir == 'N') {
r.dir = 'E';
}
else if (r.dir == 'W') {
r.dir = 'N';
}
else if (r.dir == 'S') {
r.dir = 'W';
}
else if (r.dir == 'E') {
r.dir = 'S';
}
return;
}
// r 로봇이 전진
void front(info& r)
{
if (r.dir == 'N') {
r.y += 1;
// 벽에 부딪히는 경우
if (r.y > B) {
crash_wall(r.num);
check = false;
return;
}
else {
// 다른 로봇과 부딪히는 경우
if (map[r.x][r.y] != 0) {
crash_robot(r.num, map[r.x][r.y]);
check = false;
return;
}
// 통과
else {
map[r.x][r.y] = r.num;
map[r.x][r.y - 1] = 0;
}
}
}
else if (r.dir == 'W') {
r.x -= 1;
// 벽에 부딪히는 경우
if (r.x < 1) {
crash_wall(r.num);
check = false;
return;
}
else {
// 다른 로봇과 부딪히는 경우
if (map[r.x][r.y] != 0) {
crash_robot(r.num, map[r.x][r.y]);
check = false;
return;
}
// 통과
else {
map[r.x][r.y] = r.num;
map[r.x + 1][r.y] = 0;
}
}
}
else if (r.dir == 'S') {
r.y -= 1;
// 벽에 부딪히는 경우
if (r.y < 1) {
crash_wall(r.num);
check = false;
return;
}
else {
// 다른 로봇과 부딪히는 경우
if (map[r.x][r.y] != 0) {
crash_robot(r.num, map[r.x][r.y]);
check = false;
return;
}
// 통과
else {
map[r.x][r.y] = r.num;
map[r.x][r.y + 1] = 0;
}
}
}
else if (r.dir == 'E') {
r.x += 1;
// 벽에 부딪히는 경우
if (r.x > A) {
crash_wall(r.num);
check = false;
return;
}
else {
// 다른 로봇과 부딪히는 경우
if (map[r.x][r.y] != 0) {
crash_robot(r.num, map[r.x][r.y]);
check = false;
return;
}
// 통과
else {
map[r.x][r.y] = r.num;
map[r.x - 1][r.y] = 0;
}
}
}
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
cin >> A >> B;
cin >> N >> M;
memset(map, 0, sizeof(map));
// 로봇 정보 입력받기
for (int i = 1; i <= N; i++) {
int x, y;
char dir;
cin >> x >> y >> dir;
robot[i].x = x;
robot[i].y = y;
robot[i].dir = dir;
robot[i].num = i;
map[x][y] = i;
}
check = true;
for (int i = 1; i <= M; i++) {
if (!check)
break;
int num;
char command;
int repeat;
cin >> num >> command >> repeat;
// 로봇 명령 수행
if (command == 'L') {
while (repeat--) {
if (!check)
break;
left(robot[num]);
}
}
else if (command == 'R') {
while (repeat--) {
if (!check)
break;
right(robot[num]);
}
}
else if (command == 'F') {
while (repeat--) {
if (!check)
break;
front(robot[num]);
}
}
}
if (check)
success();
}
'알고리즘 > 백준' 카테고리의 다른 글
백준 / 1509 팰린드롬 분할 C++ (0) | 2021.04.05 |
---|---|
백준 / 1800 인터넷 설치 C++ (0) | 2021.04.03 |
백준 / 1041 주사위 python3 (0) | 2021.04.01 |
백준 / 17435 합성함수와 쿼리 C++ (0) | 2021.04.01 |
백준 / 1019 책 페이지 C++ (0) | 2021.03.29 |
댓글