ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • BOJ 1726 [로봇]
    알고리즘 풀이/BFS(너비 우선 탐색) 2018. 10. 4. 06:20

    BOJ 로봇 : https://www.acmicpc.net/problem/1726




    이번 문제는 백준 온라인 저지의 [로봇] 입니다.


    재방문을 방지하기위해 Visited를 사용했습니다만, 


    3차원으로 방향에 대한 방문도 고려하도록 했습니다.



    로봇이 할 수 있는 행동인 1~3칸 앞으로 가기, 방향 꺾기 등을 큐에 담으며 탐색을 진행합니다.







    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
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    #include <iostream>
    #include <queue>
    using namespace std;
    int M, N;
    int Map[100][100];
    bool Visited[100][100][4];  //방향까지 봄
    int d[4][2= {{01}, {0-1}, {10}, {-10}};
    class Node {
    public:
        int i, j, dir, depth;
        Node() {}
        Node(int i, int j, int dir, int depth) : i(i), j(j), dir(dir), depth(depth) {}
    };
    queue<Node> q;
    Node goal;
    bool is_bound(int i, int j) {
        return i >= 0 && i < M && j >= 0 && j < N;
    }
    int BFS() {
        int result = 0;
        while(!q.empty()) {
            Node node = q.front();
            q.pop();
            int i = node.i;
            int j = node.j;
            int dir = node.dir;
            int depth = node.depth;
            if(i == goal.i && j == goal.j && dir == goal.dir) {
                return depth;
            }
            bool is_block = false;
            for(int k = 1; k <= 3; k++) {   //일직선으로 가기 먼저
                int next_i = i + d[dir][0* k;
                int next_j = j + d[dir][1* k;
                if(is_bound(next_i, next_j)) {
                    if(!Map[next_i][next_j] && !Visited[next_i][next_j][dir]) {
                        Visited[next_i][next_j][dir] = true;
                        Node new_node(next_i, next_j, dir, depth + 1);
                        q.push(new_node);
                    }
                    else if(Map[next_i][next_j]){
                        is_block = true;
                    }
                }
                if(is_block)
                    break;
            }
            //회전 하기
            int next_dir_1, next_dir_2;
            if(dir == 0 || dir == 1) {
                next_dir_1 = 2;
                next_dir_2 = 3;
            }
            else {
                next_dir_1 = 0;
                next_dir_2 = 1;
            }
            if(!Visited[i][j][next_dir_1]) {
                Visited[i][j][next_dir_1] = true;
                Node new_node(i, j, next_dir_1, depth+1);
                q.push(new_node);
            }
            if(!Visited[i][j][next_dir_2]) {
                Visited[i][j][next_dir_2] = true;
                Node new_node(i, j, next_dir_2, depth+1);
                q.push(new_node);
            }
        }
        return result;
    }
    int main() {
        cin >> M >> N;
        for(int i = 0; i < M; i++)
            for(int j = 0; j < N; j++)
                cin >> Map[i][j];
        int i, j, dir;
        cin >> i >> j >> dir;
        Node first_node(i-1, j-1, dir-10);
        Visited[i-1][j-1][dir-1= true;
        q.push(first_node);
        cin >> i >> j >> dir;
        goal.i = i-1;
        goal.j = j-1;
        goal.dir = dir-1;
        cout << BFS() << endl;
        
        return 0;
    }
    cs


    반응형

    '알고리즘 풀이 > BFS(너비 우선 탐색)' 카테고리의 다른 글

    BOJ 11559 [Puyo Puyo]  (4) 2018.10.04
    BOJ 2146 [다리 만들기]  (2) 2018.10.04
    BOJ 2234 [성곽]  (0) 2018.10.02
    BOJ 1600 [말이 되고픈 원숭이]  (3) 2018.09.23
    SWEA 5653 [줄기세포배양]  (3) 2018.09.22

    댓글

Designed by Tistory.