티스토리 뷰

www.acmicpc.net/problem/2174

 

2174번: 로봇 시뮬레이션

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

www.acmicpc.net

아주 열심히 구현하면 되는 문제였습니다. 

로봇의 위치가 주어지고, 각 로봇별 움직임이 주어졌을 때, 해당 로봇이 충돌하냐 안 하냐 구하는 문제입니다.

 

로봇이 충돌하는 경우는 아래의 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
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
TAG
more
«   2024/12   »
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
글 보관함