CS/Algorithm

[BOJ][C++] 14503 로봇청소기

별토끼. 2019. 6. 25. 16:43
반응형

[BOJ][C++] 14503 로봇청소기

풀이

1. 청소를 한다.

이 때 한 번 청소한 곳은 또 방문하면 안되기 때문에 visited를 이용합니다. 방향을 바꿀땐 사방을 다 탐색하면 후진해야하기 때문에 이를 cnt를 이용해 꼭 체크해줍니다.

1-1. map[nx][ny]가 청소할 수 있을 때 (map[nx][ny]==0 && visited[nx][ny]==0) : 다음 좌표, dir 바꾸어 func호출

1-2. map[nx][ny]가 청소할 수 없을 때  : 청소기의 방향 회전이 필요합니다. = dir, cnt+1 로 func호출

2. 후진해야 하는 경우 (cnt==4)

cnt==4 일때는 사방이 벽이거나 청소를 한 경우입니다. 이 때, 후진을 해줘야하는데 후진을 할 수 있다면 다음 좌표로 옮기면 되고, 후진이 불가능하면 종료해주면 됩니다.

2-1. 후진이 가능한 경우 : 범위체크와 벽이 아닌 경우 = 다음 좌표, dir 그대로

2-2. 후진이 불가능한 경우 : 종료(return)

코드
#define _CRT_SECURE_NO_WARNINGS
#include <cstdio>
#include <string.h>
using namespace std;
int n, m;
int r, c, d;
int res = 1;
int map[51][51];
int visited[51][51];
int dx[] = { 0,-1,0,1 }; // 회전 좌표
int dy[] = { -1,0,1,0 };
int bx[] = {1,0,-1,0}; // 후진 좌표
int by[] = {0,-1,0,1};
void cleaning(int x, int y, int dir, int cnt) {
	if (cnt == 4) {
		//후진
		int nx = x + bx[dir];
		int ny = y + by[dir];
		if (map[nx][ny] == 1 || nx <= 0 || ny <= 0 || nx >= n - 1 || ny >= m - 1) {
			return;
		}
		else {
			cleaning(nx, ny, dir, 0);
		}
	}
	else {
		int nx = x + dx[dir];
		int ny = y + dy[dir];

		//청소가능
		if (map[nx][ny] == 0 && visited[nx][ny]==0) {
			res++;
			visited[nx][ny] = 1;
			if (dir - 1 < 0) dir = 4;
			cleaning(nx, ny, dir - 1, 0);
		}
		//불가능
		else {
			if (dir - 1 < 0) dir = 4;
			cleaning(x, y, dir - 1, cnt + 1);
		}
	}
}
int main() {
	scanf("%d %d", &n, &m);
	scanf("%d %d %d", &r, &c, &d); //현재위치rc, 방향d
	memset(visited, 0, sizeof(visited));
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < m; j++) {
			scanf("%d", &map[i][j]);
		}
	}
	visited[r][c] = 1;
	cleaning(r, c, d, 0);
	printf("%d", res);
}
반응형