백준 - 14503번 : 로봇 청소기 (C++)

RoundAbout·2023년 10월 23일
0

BaekJoon

목록 보기
29/90

풀이 방법 : 구현

그냥 문제가 요구하는 대로 따라가면 된다.
여기서 헷갈리지 말아야할 것은 입력을 기준으로 어느쪽이 북쪽인지다.

또한 이미 청소를 완료한 좌표라고 하더라도 "이동"은 가능하다는 것을 까먹지 말자.

#include <iostream>
#include <vector>

int Room[51][51] = {};
bool check[51][51] = {};

int DirY[4] = { -1,0,1,0 };
int DirX[4] = { 0,1,0,-1 };

using namespace std;

int main()
{
	int N, M;
	cin >> N >> M;

	int r, c, d;
	cin >> r >> c >> d;

	for (int i = 0; i < N; ++i)
	{
		for (int j = 0; j < M; ++j)
		{
			cin >> Room[i][j];
		}
	}

	int Cnt = 0;

	while (true)
	{
		if (!check[r][c])
		{
			++Cnt;
			check[r][c] = true;
		}
		
		bool Enable = false;

		for (int i = 0; i < 4; ++i)
		{
			int NextY = r + DirY[i];
			int NextX = c + DirX[i];

			if (NextY >= N || NextY < 0 ||
				NextX >= M || NextX < 0)
				continue;

			if (Room[NextY][NextX] == 0)
			{
				if (!check[NextY][NextX])
				{
					Enable = true;
					break;
				}
			}

			else
				continue;

		}


		if (Enable)
		{
			d -= 1;

			if (d < 0)
				d = 3;

			int NextY = r + DirY[d];
			int NextX = c + DirX[d];

			if (NextY >= N || NextY < 0 ||
				NextX >= M || NextX < 0)
				continue;

			if (Room[NextY][NextX] == 0)
			{
				if (!check[NextY][NextX])
				{
					r = NextY;
					c = NextX;
				}
			}
		}

		else
		{
			int NextY = r - DirY[d];
			int NextX = c - DirX[d];

			if (NextY >= N || NextY < 0 ||
				NextX >= M || NextX < 0)
				break;

			if (Room[NextY][NextX] == 0)
			{
				r = NextY;
				c = NextX;
			}

			else
				break;
		}
	}

	cout << Cnt;
}

profile
게임하고 피자 좋아함

0개의 댓글

관련 채용 정보