알고리즘

백준 14503 로봇 청소기 C풀이 - 단순 알고리즘

머리큰개발자 2021. 4. 7. 23:24

문제에서 제시한 조건만 지켜서 탐색하면 완료되는 문제이다.

단, 처음 로봇방향을 제시하고, 로봇 방향기준 왼쪽부터 순차대로 탐색해야하므로 다음 탐색할 장소와

로봇 청소기 방향에만 신경써주자.

 

혹시 에러가 뜬다면 맵 크기나 범위 제한을 잘 해주자. 

또한 종료조건이 단 하나 뿐인 것도 유념해두자.

 

전체 코드

#include <stdio.h>
int N, M;
int Map[51][51];
int visited[51][51];
int r, c, d;
int dy[] = { -1,0,1,0 }; // 0 : 북 1 : 동 2 : 남 3 : 서
int dx[] = { 0,1,0,-1 };
//d 기준 왼쪽은 d-1;
int move() {
	int cnt = 0;
	int left = d-1+(d-1<0?4:0);
	int repeat = 0;
	while (1) {
		//printf("cnt %d left %d repeat %d r : %d c: %d\n", cnt, left, repeat, r, c);
		//4방향 다 청소할게 없을 경우
		if (repeat >= 4) {
			left= d - 2 + (d - 2 < 0 ? 4 : 0);
			//뒤로 이동하려는데 벽일 경우 종료
			if (Map[r + dy[left]][c + dx[left]]) break;
			//뒤로이동
			r += dy[left];
			c += dx[left];
			//초기화
			repeat = 0;
			left = d - 1 + (d - 1 < 0 ? 4 : 0);
			continue;
		}
		//만약 청소한 적이 없는 곳이라면 청소
		if (!visited[r][c]) {
			visited[r][c] = 1;
			cnt++;
		}
		//청소기 방향 기준 왼쪽 탐색
		int ny = r + dy[left];
		int nx = c + dx[left];
		//범위 안일 경우
		if (ny < N && ny >= 0 && nx < M && nx >= 0) {
			//청소한 곳이라면 방향만 돌림
			if (visited[ny][nx]) {
				left = left - 1 + (left - 1 < 0 ? 4 : 0);
				repeat++;
				continue;
			}
			//벽이여도 방향만 돌림
			if (Map[ny][nx]) {
				left = left - 1 + (left - 1 < 0 ? 4 : 0);
				repeat++;
				continue;
			}
			//갈 수 있는 곳이라면 이동
			r = ny;
			c = nx;
			d = left;
			repeat = 0;
			left = d- 1 + (d - 1 < 0 ? 4 : 0);

		}
		//범위 밖일 경우청소기 방향돌림
		else {
			left = left - 1 + (left - 1 < 0 ? 4 : 0);
			repeat++;
			continue;
		}

		
	}
	return cnt;
}

int solve() {
	int ret = 0;
	ret = move();

	return ret;
}

int main() {
	scanf("%d %d", &N, &M);
	scanf("%d %d %d", &r, &c, &d);
	for (int i = 0; i < N; i++) {
		for (int j = 0; j < M; j++) {
			scanf("%d", &Map[i][j]);
		}
	}
	int ans = solve();
	printf("%d", ans);
}