Suhwanc

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

 

14503번: 로봇 청소기

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

www.acmicpc.net

풀이

시뮬레이션 문제입니다!

이 문제는 조건이 조금 까다로운데, 

나는 4가지 조건 중 c,d 번 먼저 해결하려고 하였다.

왜냐하면 c,d번을 만족시킬때 (네 방향 모두가 벽이거나 청소된 상태) 절대 a,b 번을 수행할 수 없기 때문이다.

따라서 우선 4방향을 탐색 후 뒤쪽 방향이 벽이면 d번, 아니면 c번을 하고,

탐색 결과가 c,d번을 만족시키지 않는 경우, 왼쪽 방향을 보고 a번 또는 b번을 수행시키도록 한다.

문제를 풀 때 변수로 만들어주어야 할 부분은 

 

1. 로봇 청소기의 현재 방향과 위치

2. N x M 크기의 지도

3. 로봇 청소기가 바라보는 방향의 반대 방향 (후진을 할 수 있는지 판별하기 위함)

 

이 정도이며, 이 문제에서 주어지는 방향 (0은 북쪽, 1은 동쪽, 2는 남쪽, 3은 서쪽) 에 대한 왼쪽방향을 구하기 위해

서쪽을 제외하고는 현 방향에 +1 씩 해주었고(서쪽은 0), 후진 방향은 방향에 따라서 +2 또는 -2 해주면 된다. 

 

소스 코드

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
#include <iostream>
using namespace std;
 
int board[50][50];
int dy[4= { -1010 };
int dx[4= { 010-1 };
int main()
{
    int n, m; scanf("%d %d"&n, &m);
    int r, c, d; scanf("%d %d %d"&r, &c, &d);
    for (int i = 0; i < n; i++) {
        for (int j = 0; j < m; j++) {
            scanf("%d"&board[i][j]);
        }
    }
    int ans = 0;
 
    while (1) {
        if (board[r][c] == 0) {
            ans++;
            board[r][c] = 2;
        }
        //c,d 번 check
        bool check = false;
        for (int i = 0; i < 4; i++) {
            if (0 <= r + dy[i] && r + dy[i] < n && 0 <= c + dx[i] && c + dx[i] < m) {
                if (board[r + dy[i]][c + dx[i]] == 0) check = true;
            }
        }
        int temp_back = 0//뒤쪽 방향 구하기
        if (d < 2) temp_back = d + 2;
        else temp_back = d - 2;
        if (!check && board[r + dy[temp_back]][c + dx[temp_back]] == 1) { //d번 사례
            break;
        }
        if (!check) { //c번 사례
            r = r + dy[temp_back];
            c = c + dx[temp_back];
            continue;
        }
        int temp_left = 0// 왼쪽 방향 구하기
        if (d > 0) temp_left = d - 1;
        else temp_left = 3;
        if ((0 <= r + dy[temp_left] && r + dy[temp_left] < n && 0 <= c + dx[temp_left] && c + dx[temp_left] < m) && board[r + dy[temp_left]][c + dx[temp_left]] == 0) { //a번 사례
            r = r + dy[temp_left];
            c = c + dx[temp_left];
            d = temp_left;
            continue;
        }
        else {
            d = temp_left;
            continue;
        }
    }
    printf("%d\n", ans);
    return 0;
}
cs

개발환경 : Visual Studio 2019

지적, 조언 언제든지 환영입니다~~

'백준 문제풀이' 카테고리의 다른 글

백준 11066번 파일 합치기  (0) 2020.02.12
백준 2252번 줄 세우기  (0) 2020.02.12
백준 14499번 주사위 굴리기  (0) 2020.01.27
백준 15658번 연산자 끼워넣기 2  (0) 2020.01.20
백준 1248번 맞춰봐  (0) 2020.01.20