ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [백준] 13901번 로봇
    문제 풀이 2020. 7. 15. 21:10

    13901번 로봇


    문제


    해빈이는 로봇을 좋아한다. 로봇을 가지고 놀던 해빈이는 로봇에게 계속해서 명령을 내려 움직이는 대신 이동할 방향을 미리 지정하여 로봇이 알아서 움직이도록 하였다.  이 로봇은 다음과 같은 규칙을 가지고 움직인다.

    - 로봇은 사용자가 지정한 방향을 일직선으로 움직인다.

    - 이동 중 벽이나 방문한 지역, 장애물을 만날 경우 로봇은 사용자가 지정한 다음 방향으로 움직인다.

    - 사용자가 지정한 다음 방향이 없다면 맨 처음 방향으로 돌아가서 위의 과정을 반복한다.

    - 로봇이 움직일 수 없을 경우 동작을 멈춘다. 


    입력으로 방의 크기와 장애물의 개수, 각 장애물들의 위치, 로봇의 시작 위치, 이동 방향의 순서가 주어졌을 때 로봇이 멈추는 위치를 출력하시오. 위치 (0, 0)은 왼쪽 위를 가리키며 방의 크기가 R * C일 때 오른쪽 아래 위치는 (R - 1, C - 1)이 된다. (R은 세로의 크기를 C은 가로의 크기를 말한다.)


    입력


    첫 번째 줄에는 방의 크기 R, C(3  R, C  1,000)가 입력된다. 두 번째 줄에는 장애물의 개수 k(0  k  1,000)가 입력된다. 다음 k개의 줄에는 각 장애물 위치 br(0 ≤ br  R – 1), bc(0  bc  C - 1)가 주어진다. 그 다음 순서대로 로봇의 시작 위치 sr(0  sr  R – 1), sc(0  sc  C - 1)와 이동 방향의 순서(총 4개가 입력되는데 1은 위 방향, 2은 아래 방향, 3은 왼쪽 방향, 4는 오른쪽 방향을 나타낸다)가 한 줄씩 입력된다. 로봇의 시작위치에 장애물이 있는 경우는 없다.


    출력


    로봇의 마지막 위치 r, c를 출력한다.



    풀이)

    dfs를 이용해서 푼 문제이다.


    로봇은 벽과 장애물, 이미 자신이 방문했던 곳은 갈 수 없다.

    따라서 장애물과 자신이 방문했던 곳은 

    bool visited[1000][1000] // visited[][]= true 로 체크해 주었다.


    과정은 이러하다.

    1. 로봇의 현재위치에서 지정한 방향으로 갈 수 있는지 확인

     1.1 갈 수 있다면 이동한 후 다시 1번 수행

     1.2 갈 수 없다면, 다음 방향을 살펴봄 -> 다음 방향으로 갈 수 있다면 이동한 후 다시 1번 수행

        갈 수 없다면 다른 방향 또 살핌

    2. 총 4개의 방향으로 모두 갈 수 없다면 로봇은 더 이상 움직일 수 없음 -> 종료


    주의

    로봇이 맨 처음 위치한 곳도 방문 표시를 해줘야한다.


    코드)

    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
    #include <stdio.h>
    #include <algorithm>
    using namespace std;
     
    int R, C;
    int k;
    bool visited[1000][1000];
    pair<intint> robot;//로봇 위치
    int direc[4];//사용자가 저장한 이동방향
    int dy[5= { 0,-1,1,0,0 }; // 1 = 위, 2 = 아래, 3 = 왼쪽, 4 = 오른쪽
    int dx[5= { 0,0,0,-1,1 };
     
    void dfs(int y,int x,int dir) {
        bool fail = true;
        int cnt = 4//현재방향 + 3개의 다른 방향 체크 = 총 4번 체크
        while (cnt--) {
            int ny = y + dy[direc[dir]];
            int nx = x + dx[direc[dir]];
            if (ny >= 0 && ny < R && nx >= 0 && nx < C) {
                if (!visited[ny][nx]) {
                    visited[ny][nx] = true;
                    dfs(ny, nx, dir);
                    fail = false;
                    break;
                }
            }
            dir = (dir + 1) % 4;
        }
        //4방향 모두 살폈는데 더 이상 움직일 수 없으면 동작 stop
        if (fail) {
            robot.first = y;
            robot.second = x;
        }
    }
     
    int main() {
        scanf("%d %d %d"&R, &C,&k);
        for (int i = 0; i < k; i++) {
            int br, bc;
            scanf("%d %d"&br, &bc);
            visited[br][bc] = true//장애물 표시
        }
        scanf("%d %d"&robot.first, &robot.second);
        visited[robot.first][robot.second] = true;
        for (int i = 0; i < 4; i++) {
            scanf("%d"&direc[i]);
        }
        dfs(robot.first, robot.second, 0);
        printf("%d %d", robot.first, robot.second);
        return 0;
    }
    cs


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

    [백준] 2151번 거울설치  (0) 2020.07.17
    [백준] 1016번 제곱 ㄴㄴ수  (0) 2020.07.16
    [백준] 14620번 꽃길  (0) 2020.07.14
    [백준] 14923번 미로 탈출  (0) 2020.07.14
    [백준] 13537번 수열과 쿼리1  (0) 2020.07.13

    댓글

Designed by Tistory.