[BOJ2174] 로봇 시뮬레이션

4 분 소요

[BOJ2174] 로봇 시뮬레이션

문제 링크

문제설명

  • 보드판에 입력받은 수 N만큼 로봇을 설치한다. 로봇은 각각 동서남북중 방향을 하나 가지고 있다.
  • 보드판은 일반적인 배열과 다르게, 왼쪽 하단이 1,1이 된다.
  • 로봇에 명령을 내릴 수 있는데 명령의 종류는 3가지이다. 첫번째는 로봇이 향하는 기준의 왼쪽 방향으로 90도 회전, 두번째는 오른쪽으로 90도 회전, 세번째는 로봇이 향하는 방향으로 한칸 앞으로 전진하는 명령어이다.
  • 만약 로봇이 보드판 밖으로 이동하게되면 밖으로 나갔다는 경고문을 출력, 다른 로봇과 부딪히면 몇번로봇과 충돌하였다는 경고문을 출력하는 문제이다.

코드리뷰

  • 풀다보니 조금 어렵게 푼거같은데, 보드 배열을 입력받을때 보드를 구조체 자료형으로 설정한다. 보드 구조체 안에는 왼쪽하단이 1,1로 되어있는 번호에 맞게, x좌표, y좌표를 입력받고, 로봇이 있는지 있다면 몇번 로봇이 들어있는지를 체크하는 int형 check 변수가 들어있다.
  • 입력받는 로봇 역시 개체 하나당 구조체를 이용하여 로봇의 x좌표 y좌표, 그리고 초기에 향하고있는 방향을 입력받는 변수를 가지고 있는다. 방향은 북서남동 순으로 0,1,2,3 정수로 표현해놓는다.
  • board 배열의 각 칸에 x좌표 y좌표는 board[i][j].x = j+1 , board[i][j].y= B-i 의 식을 이용하여 1,1이 왼쪽하단인 모양으로 좌표값을 저장해두면된다.
  • 나머지는 시뮬레이션으로, 명령을 n번 수행하고났을 때 함수의 return 값이 0이면 아무 경고문이 나지 않은 것이므로, OK를 출력한다.
  • 중간에 보드판을 넘어갈 경우, 리턴값을 -1로 하여, 함수를 리턴시키고, 보드판을 넘어갔다는 경고문을 출력한다.
  • 로봇이 움직일 때마다 board배열의 체크 값에 그 배열칸에 멈춰있는 로봇의 번호를 저장해두고, 한 로봇이 다음칸으로 갈때 체크값이 0이 아닐 경우, 그 체크 값을 반환시키고 체크값번호를 가진 로봇과 충돌했다는 경고문을 출력한다.
#include <iostream>
using namespace std;

typedef struct {
	int x;
	int y;
	int check;
}Board;

typedef struct {
	int dir;
	int x;
	int y;
}Robot;

Robot robot[10000];
Board board[100][100];
int A, B;
char direct[4] = { 'N','W','S','E' };

int robot_simul(int * robotNum, char * di_func, int * cnt) {
	if (*di_func == 'L') {
		for (int c = 0; c < *cnt; c++) {
			if (robot[*robotNum].dir != 3) {
				robot[*robotNum].dir++;
			}
			else if (robot[*robotNum].dir == 3) {
				robot[*robotNum].dir = 0;
			}
		}
		return 0;
	}
	else if (*di_func == 'R') {
		for (int c = 0; c < *cnt; c++) {
			if (robot[*robotNum].dir != 0) {
				robot[*robotNum].dir--;
			}
			else if (robot[*robotNum].dir == 0) {
				robot[*robotNum].dir = 3;
			}
		}
	}
	else if (*di_func == 'F') {
		for (int c = 0; c < *cnt; c++) {
			
			if (robot[*robotNum].dir == 0) {
				int xnext = robot[*robotNum].x;
				int ynext = robot[*robotNum].y + 1;
				if (xnext<1 || xnext>A || ynext<1 || ynext>B) {
					return -1;
				}
				if (board[B - ynext][xnext + 1].check != 0) {
					return board[B - ynext][xnext + 1].check;
				}
				if (board[B - ynext][xnext + 1].check == 0) {
					board[B - ynext][xnext + 1].check = *robotNum;
					board[B- robot[*robotNum].y][robot[*robotNum].x+1].check = 0;
					robot[*robotNum].x = xnext;
					robot[*robotNum].y = ynext;
				}
			}
			else if (robot[*robotNum].dir == 1) {
				int xnext = robot[*robotNum].x - 1;
				int ynext = robot[*robotNum].y;
				if (xnext<1 || xnext>A || ynext<1 || ynext>B) {
					return -1;
				}
				if (board[B - ynext][xnext + 1].check != 0) {
					return board[B - ynext][xnext + 1].check;
				}
				if (board[B - ynext][xnext + 1].check == 0) {
					board[B - ynext][xnext + 1].check = *robotNum;
					board[B- robot[*robotNum].y][robot[*robotNum].x+1].check = 0;
					robot[*robotNum].x = xnext;
					robot[*robotNum].y = ynext;
				}
			}
			else if (robot[*robotNum].dir == 2) {
				int xnext = robot[*robotNum].x;
				int ynext = robot[*robotNum].y - 1;
				if (xnext<1 || xnext>A || ynext<1 || ynext>B) {
					return -1;
				}
				if (board[B - ynext][xnext + 1].check != 0) {
					return board[B - ynext][xnext + 1].check;
				}
				if (board[B - ynext][xnext + 1].check == 0) {
					board[B - ynext][xnext + 1].check = *robotNum;
					board[B- robot[*robotNum].y][robot[*robotNum].x+1].check = 0;
					robot[*robotNum].x = xnext;
					robot[*robotNum].y = ynext;
				}
			}
			else if (robot[*robotNum].dir == 3) {
				int xnext = robot[*robotNum].x + 1;
				int ynext = robot[*robotNum].y;
				if (xnext<1 || xnext>A || ynext<1 || ynext>B) {
					return -1;
				}
				if (board[B - ynext][xnext + 1].check != 0) {
					return board[B - ynext][xnext + 1].check;
				}
				if (board[B - ynext][xnext + 1].check == 0) {
					board[B - ynext][xnext + 1].check = *robotNum;
					board[B- robot[*robotNum].y][robot[*robotNum].x+1].check = 0;
					robot[*robotNum].x = xnext;
					robot[*robotNum].y = ynext;
				}
			}
		}
	}
	return 0;
}
int main() {
	ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	cin >> A >> B;
	int N, M;
	cin >> N >> M;
	for (int i = 0; i < B; i++) {
		for (int j = 0; j < A; j++) {
			board[i][j].y = B - i;
			board[i][j].x = j + 1;
			board[i][j].check = 0;
		}
	}
	for (int n = 1; n <= N; n++) {
		int x, y;
		char d;
		cin >> x >> y >> d;
		robot[n].x = x;
		robot[n].y = y;
		board[B-y][x+1].check = n;
		for (int i = 0; i < 4; i++) {
			if (direct[i] == d) robot[n].dir = i;
		}
	}
	
	for (int m = 0; m < M; m++) {
		int robot_num;
		char func;
		int func_cnt;
		cin >> robot_num >> func >> func_cnt;
		int ans = robot_simul(&robot_num, &func, &func_cnt);
		if (ans == -1) {
			cout << "Robot " << robot_num << " crashes into the wall" << '\n';
			break;
		}
		else if (ans > 0) {
			cout << "Robot " << robot_num << " crashes into robot " << ans << '\n';
			break;
		}
		else if (m == M - 1 && ans == 0) {
			cout << "OK" << '\n';
		}
	}
	return 0;
}

댓글남기기