ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 로봇 청소기
    백준알고리즘 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);
    }

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

    '백준알고리즘' 카테고리의 다른 글

    좋은수열  (0) 2019.09.05
    숨바꼭질2  (0) 2019.09.01
    레이저 통신  (0) 2019.09.01
    물통  (0) 2019.09.01
    DSLR  (0) 2019.09.01

    댓글

Designed by Tistory.