본문 바로가기

알고리즘/백준

백준 14503번 문제 로봇 청소기 C/C++ 풀이

https://www.acmicpc.net/problem/14503

 

이 역시도 시뮬레이션 문제.

간단히 문제의 상황을 구현만 해주면 된다.

별다른 어려움은 없는 문제!

 

#include <stdio.h>

//input이 긴 문제는 일일히 input 치기가 귀찮아서 fopen으로 input을 넣는다.
FILE* in = fopen("input.txt", "r");

int n, m;
int now_x, now_y, now_dir;
int map[51][51];
int turn;
//문제의 조건에 따라 0 북, 1 동, 2 남, 3 서
int dir_x[4] = { -1, 0, 1, 0 };
int dir_y[4] = { 0, 1, 0, -1 };
int dir_num;
// 3 조건인지 4 조건인지 구분
bool possible = true;
// 로봇청소기가 있는 쪽은 무조건 비어있다고 했으니까 한 구역은 무조건 청소
int ans = 1;

int main() {
	//입력
	fscanf(in, "%d %d", &n, &m);
	fscanf(in, "%d %d %d", &now_x, &now_y, &now_dir);
	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
			fscanf(in, "%d ", &map[i][j]);
    //4 방향 다 돌고, 뒤로 가지도 못해야 함
	while (turn < 4 || possible)
	{
    	//로봇청소기가 있는 위치는 청소한 것으로 표시
		map[now_x][now_y] = 2;
        //왼쪽으로 회전, 북 -> 서 -> 남 -> 동
		now_dir = (now_dir + 3) % 4;
        // 청소되어있거나 벽이면 turn
		if (map[now_x + dir_x[now_dir]][now_y + dir_y[now_dir]] == 1 || map[now_x + dir_x[now_dir]][now_y + dir_y[now_dir]] == 2)
			turn++;
        // 아니면 그 위치로 가고, 답 + 1, turn 초기화
		else
		{
			now_x = now_x + dir_x[now_dir]; now_y = now_y + dir_y[now_dir];
			turn = 0;
			ans++;
		}
        // 4번 다 돌았다면
		if (turn == 4)
		{
        	//후진하는 방향
			int back_dir = (now_dir + 2) % 4;
            //후진하는 방향으로 갔을 때 벽이면 false 반환
			if (map[now_x + dir_x[back_dir]][now_y + dir_y[back_dir]] == 1)
				possible = false;
            //아니면 그곳으로 이동하고 turn 초기화
			else
			{
				now_x = now_x + dir_x[back_dir]; now_y = now_y + dir_y[back_dir];
				turn = 0;
			}
		}
	}
    //출력
	printf("%d", ans);
}