문제 링크

 

14503번: 로봇 청소기

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

www.acmicpc.net

 

문제 유형

 

시뮬레이션

 

풀이

 

문제의 조건대로 구현해주면 되는 시뮬레이션 문제입니다.

청소한 곳은 map의 값을 2, 청소가 안된 빈 곳은 0, 벽은 1로 표현했습니다.

1. 현재 위치를 청소해준다.

2. 네 방향 모두 청소가 되어있거나 벽인 경우

 2-1. 현재 방향의 뒤의 블록이 벽인 경우 종료

 2-2. 벽이 아닌 경우 뒤로 후진

3. 네 방향 중 청소가 안되었거나 벽이 아닌 경우(회전해준 후)

 3-1. 왼쪽 방향이 청소가 안되었다면 앞으로 전진

 3-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
58
59
60
61
62
63
64
65
66
67
#include <iostream>
 
using namespace std;
 
int n, m, y, x,d;
int map[51][51];
int dy[4= { -1,0,1,0 };
int dx[4= { 01,0,-1 };
 
int function()
{
    freopen("input.txt""r", stdin);
    setbuf(stdout, NULL);
 
    ios_base::sync_with_stdio(false);
    cin.tie(0);
 
    cin >> n >> m >> y >> x >> d;
 
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < m; j++)
        {
            cin >> map[i][j];
        }
    }
 
    int ans = 0;
 
    while (1)
    {
        if (map[y][x] == 0
            ans++;
        map[y][x] = 2;
 
        if (map[y][x - 1!= 0 && map[y][x + 1!= 0 && map[y - 1][x] != 0 && map[y + 1][x] != 0)     
        {// 네 방향 모두 청소되었거나 벽
            if (map[y - dy[d]][x - dx[d]] != 1// 뒤쪽에 벽이 아니라 후진
            {
                y -= dy[d];
                x -= dx[d];
            }
            else // 후진 못할 시
            {
                break;
            }
        }
        else
        {
            if (d == 0)
                d = 3;
            else
                d -= 1;
            
            if (map[y + dy[d]][x + dx[d]] == 0// 회전한방향이 청소안한 칸
            {
                y += dy[d];
                x += dx[d];
            }
            //else 청소한칸이거나 벽
        }
    }
 
    cout << ans;
 
    return 0;
}

'Algorithm > boj' 카테고리의 다른 글

백준 2110번 공유기 설치  (1) 2021.10.24
백준 14890번 경사로  (0) 2019.11.11
백준 15662번 톱니바퀴 (2)  (0) 2019.11.10
백준 14891번 톱니바퀴  (0) 2019.11.10
백준 14499번 주사위 굴리기  (0) 2019.11.10

+ Recent posts