본문 바로가기

Algorithm/시뮬레이션

[백준][14503번][시뮬레이션] 로봇 청소기

iSharp

 

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

 

 

 

 

<문제>

 

 

 

 

 

<코드>

 

#include <cstdio>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>

using namespace std;

int n, m, r, c, d, dir = 0; //0123 북동남서
int map[51][51];
int visit[51][51]; // 청소안한곳 0, 벽이면 -1
int dx[4] = { -1,0,1,0 };
int dy[4] = { 0,1,0,-1 };

int solve(int a, int b, int cnt, int dir)
{
	if (visit[a][b] == 0)
	{
		visit[a][b] = cnt;
		cnt++;
	}
	/*
	if (cnt == 60)
	{
		cout << a << b << dir;
		return cnt;
	}*/
	if ((visit[a - 1][b] == -1 || visit[a - 1][b] > 0) && (visit[a + 1][b] == -1 || visit[a + 1][b] > 0) && (visit[a][b - 1] == -1 || visit[a][b - 1] > 0) && (visit[a][b + 1] == -1 || visit[a][b + 1] > 0))
	{
		// 뒤쪽이 벽이라 후진도 못해서 종료
		if (visit[a + dx[(dir+2)%4]][b + dy[(dir+2)%4]] == -1)
		{
			//cout << a << ' ' << b << ' ' << dir << ' ';
			return cnt;
		}
		// 뒤쪽이 벽이 아니라 후진
		else
		{
			a += dx[(dir+2)%4];
			b += dy[(dir+2)%4];
			return solve(a, b, cnt, dir);
		}
	}
	for (int i = 0; i < 4; i++)
	{
		dir = (dir + 3) % 4;
		// 왼쪽방향 청소 안했으면
		if (visit[a+dx[dir]][b+dy[dir]] == 0)
		{
			a += dx[dir];
			b += dy[dir];
			return solve(a, b, cnt, dir);
			break;
		}
		// 왼쪽방향 벽이거나 청소했으면 
		else
		{
			continue;
		}
	}
	//cout << "ASDfasfdasfD";
	





}

void printMap()
{
	cout << endl;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			printf("%3d", visit[i][j]);
		}
		cout << endl;
	}

}

int main()
{
	//cout << "Qwerqwer";
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> n >> m;
	cin >> r >> c >> d;
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < m; j++)
		{
			cin >> map[i][j];
			if (map[i][j] == 1)
				visit[i][j] = -1;
		}
	}

	int ans = solve(r, c, 1, d);
	//printMap();
	cout << ans-1;



}