끄적끄적 코딩
article thumbnail

시뮬레이션 문제입니다.
순서에 맞게 문제를 해결해나가면 됩니다.

1. 현재 위치 청소
2. 보고 있는 방향의 왼쪽 탐색
3. 더러울 시 그 위치로 이동 (방향은 유지) => 1번으로 이동
4. 깨끗하거나 벽일 경우 => 2번으로 이동
5. 4방면이 전부 깨끗하거나 벽일 경우 현재 보고 있는 방향의 뒤로 후진 (방향은 그대로) => 1번으로 이동
6. 후진의 경우 후진할 위치가 벽일 경우 => 종료

위의 방식으로 재귀함수를 만들어주었습니다.

 

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

int map[60][60];
int c = 0;

void move(int a, int b, int d)
{
	for (int i = 0; i < 4; ++i) {
		int curDir = (d + 7 - i) % 4;
		int curX = b;
		int curY = a;

		switch (curDir) {
			case 0:
				curY -= 1;
				break;
			case 1:
				curX += 1;
				break;
			case 2:
				curY += 1;
				break;
			case 3:
				curX -= 1;
				break;
		}
		if (map[curY][curX] == 0) {
			map[curY][curX] = 2;
			++c;
			move(curY, curX, curDir);
			return;
		}
	}

	switch (d) {
		case 0:
			a += 1;
			break;
		case 1:
			b -= 1;
			break;
		case 2:
			a -= 1;
			break;
		case 3:
			b += 1;
			break;
	}

	if (map[a][b] != 1) {
		move(a, b, d);
	}
}

int main(int argc, char *argv[])
{
	int n, m;
	int startX, startY;
	int direction;

	cin >> n >> m;
	cin >> startY >> startX >> direction;

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

	map[startY][startX] = 2;
	move(startY, startX, direction);

	cout << c + 1 << endl;

	return 0;
}

검색 태그