백준알고리즘

로봇 청소기

먼지의삶 2019. 9. 1. 23:17

 

로봇 청소기 삼성 기출문제, 시뮬레이션문젠데 지난번에는 BFS써서 풀었었던 기억이있다.

BFS말고, 그냥 문제에 주어진로직대로 풀어보는 방식을 사용해서 문제를 재구성했다.

 

#include<cstdio>//

using namespace std;

struct robot {//0북1동 2남, 3서
	int x = 0, y = 0, dir = 0, cnt = 1;
	robot(int x, int y, int dir) {
		this->x = x;
		this->y = y;
		this->dir = dir;
	}
};
int dx[] = { -1,0,1,0 };
int dy[] = { 0,1,0,-1 };
robot rb = robot(0,0,0);
int r, c, X, Y, D;
int map[51][51];
bool dist[51][51];
bool first() {
	int x = rb.x; int y = rb.y;
	int d = rb.dir;
	d -= 1;
	if (d < 0) d = 3;
//	printf("%d\n", d);
	int nx = rb.x + dx[d]; int ny = rb.y + dy[d];
	if (dist[nx][ny] == false && map[nx][ny] == 0) {
		dist[nx][ny] = true;
		rb.x = nx; rb.y = ny;
		rb.dir = d;
		rb.cnt++;
	//	printf("%d %d %d true\n", nx, ny, d);
		return true;
	}
	else {
		rb.dir = d;
		return false;
	}
}
void cleaning() {
	while (true) {
		bool no1 = false;
		if (first()) {
			no1 = true;
			continue;
		}
		else {
			for (int i = 0; i < 3; i++) {
				no1 = first();
				if (no1) break;
			}
		}
		if (no1) { continue; }
		bool no2 = false;
		if (!no1) {
			int d = 0;
			int nx; int ny;
			switch (rb.dir) {
			case 0:
				nx = rb.x + dx[2]; ny = rb.y + dy[2];
				if (map[nx][ny] != 1) {
					rb.x = nx; rb.y = ny;
					no2 = true;
				}
				break;
			case 1:
				nx = rb.x + dx[3]; ny = rb.y + dy[3];
				if (map[nx][ny] != 1) {
					rb.x = nx; rb.y = ny;
					no2 = true;
				}
				break;
			case 2:
				nx = rb.x + dx[0]; ny = rb.y + dy[0];
				if (map[nx][ny] != 1) {
					rb.x = nx; rb.y = ny; no2 = true;
				}
				break;
			case 3:
				nx = rb.x + dx[1]; ny = rb.y + dy[1];
				if (map[nx][ny] != 1) {
					rb.x = nx; rb.y = ny; no2 = true;
				}
				break;
			}
		}
		if (!no2 && !no1) break;

	}

}

int main() {
	scanf("%d %d %d %d %d", &r, &c, &X, &Y, &D);
	rb = robot(X, Y, D);
	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
			scanf("%d", &map[i][j]);
		}
	}
	dist[rb.x][rb.y] = true;
	cleaning();
	/*for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
			if (dist[i][j] == true) printf("1 ");
			else printf("0 ");
		}
		printf("\n");
	}*/
	printf("%d", rb.cnt);
}

디버깅하는 과정에서 귀찮은 부분이 좀많았지만, 그래도 로직자체가 굉장히 간단한 문제인지라 어렵지않았음