아무코딩

[백준 14503] 로봇청소기 본문

알고리즘/백준

[백준 14503] 로봇청소기

동 코 2020. 4. 6. 17:07

문제풀이 시간 43분

문제풀이

문제에 명시되어있는 로봇청소기 작동 로직을 그대로 따라 하면 된다. (시뮬레이션 문제)

후진 시 바라보는 방향을 안 바꿔줘야 되는데 실수로 바꿔버리는 바람에 오류 잡느라 다 찍어보며 시간이 걸렸다.

 

 

소스코드

더보기
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#include <stdio.h>
#include <stdio.h>
int N, M;
typedef struct Robot {
    int r, c, d;
    Robot() {}
    Robot(int rr, int cc, int dd) { r = rr; c = cc; d = dd; }
}Robot;
 
 
int Map[51][51];
int dir_row[4= {-1,0,1,0};
int dir_col[4= {0,1,0,-1};
 
int cnt = 0;
 
bool isRange(int r, int c) {
    return r >= 0 && c >= 0 && r < N&&< M;
}
 
void printMap(Robot robot) {
    printf("\ncnt : %d\n", cnt);
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            if (i == robot.r&&== robot.c)
                printf("R ");
            else
                printf("%d ", Map[i][j]);
        }
        printf("\n");
    }
}
 
void cleanMap(Robot robot) {
    //현재위치 청소
    if (Map[robot.r][robot.c] == 0) {
        cnt++;
        Map[robot.r][robot.c] = 2;
    }
    //printMap(robot);
    for (int i = 0; i < 4; i++) {
        int cur_dir = robot.d;
        int left_dir = (robot.d - 1< 0 ? 3 : robot.d - 1;
        int next_row = robot.r + dir_row[left_dir];
        int next_col = robot.c + dir_col[left_dir];
        if (isRange(next_row, next_col) && Map[next_row][next_col] == 0) {
            cleanMap(Robot(next_row, next_col, left_dir));
            return;
        }
        robot.d = (robot.d + 3) % 4;
    }
 
    //한칸 후진 해야됨.
    int back_dir = (robot.d + 2) % 4;
    int next_row = robot.r + dir_row[back_dir];
    int next_col = robot.c + dir_col[back_dir];
    if (isRange(next_row, next_col) && Map[next_row][next_col] !=1) {
        
        cleanMap(Robot(next_row, next_col,robot.d));
        return;
    }
    //다안되는 경우 일로통과 그리고 리턴됨
    return;
}
int main() {
    Robot robot;
    scanf("%d %d"&N, &M);
    scanf("%d %d %d"&robot.r, &robot.c, &robot.d);
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < M; j++) {
            scanf("%d"&Map[i][j]);
        }
    }
    cleanMap(robot);
 
    printf("%d\n", cnt);
 
}
 
 

 

문제 링크 : https://www.acmicpc.net/problem/14503

 

14503번: 로봇 청소기

로봇 청소기가 주어졌을 때, 청소하는 영역의 개수를 구하는 프로그램을 작성하시오. 로봇 청소기가 있는 장소는 N×M 크기의 직사각형으로 나타낼 수 있으며, 1×1크기의 정사각형 칸으로 나누어져 있다. 각각의 칸은 벽 또는 빈 칸이다. 청소기는 바라보는 방향이 있으며, 이 방향은 동, 서, 남, 북중 하나이다. 지도의 각 칸은 (r, c)로 나타낼 수 있고, r은 북쪽으로부터 떨어진 칸의 개수, c는 서쪽으로 부터 떨어진 칸의 개수이다. 로봇 청소기는 다음

www.acmicpc.net

 

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

[백준 15685] 드래곤 커브  (0) 2020.04.15
[백준 5214] 환승  (0) 2020.04.15
[백준 16638] 괄호 추가하기 2  (1) 2020.03.31
[백준 12094] 2048(hard)  (0) 2020.03.29
[백준 15683] 감시  (0) 2020.03.27
Comments