[백준/BOJ] 백준 14503번 : 로봇 청소기

2020. 9. 8. 02:50알고리즘 문제풀이

www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어

www.acmicpc.net

int clean_dxdy[4][2]를 이용해 청소할 위치를 확인하였고, int dxdy[4][2]를 이용해 후진하는 위치를 나타낼 때 사용했다.

 

코드

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;

int n, m;
int r, c, d;
int board[50][50];
int clean[50][50];
int clean_dxdy[4][2] = { {0,-1},{-1,0},{0,1},{1,0} };
int dxdy[4][2] = { {-1,0},{0,1},{1,0},{0,-1} };
int cnt = 0;

void Solve(pair<pair<int, int>, int> start)
{
	pair<pair<int, int>, int> here = start;

	//here 칸을 청소한적이 없을때
	if (clean[here.first.first][here.first.second] == 0)
	{
		clean[here.first.first][here.first.second] = 1;
		cnt++;
	}

	pair<pair<int, int>, int> there;

	for (int i = 0; i < 4; i++)
	{
		//청소를 확인할 위치
		pair<int, int> clean_xy = make_pair(here.first.first + clean_dxdy[here.second][0], here.first.second + clean_dxdy[here.second][1]);

		//확인하는 위치가 청소한적이 있거나, 벽일때
		if (clean[clean_xy.first][clean_xy.second] == 1 || board[clean_xy.first][clean_xy.second] == 1)
		{
			//회전
			here.second = here.second - 1;
			if (here.second < 0)
				here.second = 3;

			//네 방향이 모두 청소가 되어 있거나 벽일때
			if (i == 3)
			{
				//한칸 후진
				there = make_pair(make_pair(here.first.first - dxdy[here.second][0], here.first.second - dxdy[here.second][1]), here.second);

				//후진할 수 없을때
				if (there.first.first < 0 || there.first.first >= n || there.first.second < 0 || there.first.second >= m || board[there.first.first][there.first.second] == 1)
					return;

				else
					break;
			}
		}

		//청소할 공간을 찾았을때
		else
		{
			there.second = here.second - 1;
			if (there.second < 0)
				there.second = 3;

			there.first.first = clean_xy.first;
			there.first.second = clean_xy.second;

			break;
		}
	}

	//there위치로 이동
	Solve(there);
}

int main()
{
	cin.tie(NULL);
	ios_base::sync_with_stdio(false);

	memset(clean, 0, sizeof(clean));

	cin >> n >> m;
	cin >> r >> c >> d;

	int input;

	for (int i = 0; i < n; i++)
		for (int j = 0; j < m; j++)
		{
			cin >> input;
			board[i][j] = input;
		}

	pair<pair<int, int>, int> start = make_pair(make_pair(r, c), d);

	Solve(start);

	cout << cnt;

	return 0;
}