본문 바로가기

Problem/BFS

[C/C++] BOJ 1600 :: 말이 되고픈 원숭이

BOJ 1600 :: 말이 되고픈 원숭이




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







나의 풀이



>> 방문 여부를 확인하는 배열을 3차원으로 만든다.


// 방문 여부 [x좌표][y좌표][말같이 움직인 횟수]
int visited[201][201][31];



- K만큼 말같이 이동하지 않았으면, 말같이 이동하는 경우를 queue에 갱신시킨다.

- 원숭이가 이동하는 경우를 queue에 갱신시킨다.

- 도착지점에 도달하면 return 한다.




나의 코드




Github : https://github.com/j2wooooo/Daliy_Algorithms/blob/master/Daliy_Algorithms/BOJ_1600/BOJ_1600.cpp




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
89
90
// 백준알고리즘 1600번 :: 말이 되고픈 원숭이
#include<iostream>
#include<queue>
using namespace std;
 
int W, H, K, ans;
bool flag;
int grid[201][201];
// 방문 여부 [x좌표][y좌표][말같이 움직인 횟수]
int visited[201][201][31];
queue<pair<pair<intint>,int>> monkey;
 
// 말의 이동방식
int dh[8][2= { {-2-1}, {-21}, {-1-2}, {-12}, {1-2}, {12}, {2-1}, {21} };
// 원숭이의 이동방식
int dm[4][2= { {0,1}, {0-1}, {10}, {-1,0} };
 
void bfs()
{
    while (!monkey.empty())
    {
        int qsz = monkey.size();
        while (qsz--)
        {
            int x = monkey.front().first.first;
            int y = monkey.front().first.second;
            int count = monkey.front().second;
            monkey.pop();
 
            if (x == H - 1 && y == W - 1)
            {
                flag = 1;
                return;
            }
 
            // K번 보다 적게 말같이 움직였으면, 지금 말같이 움직일 수 있다.
            if (count < K)
            {
                for (int i = 0; i < 8; i++)
                {
                    int mx = x + dh[i][0];
                    int my = y + dh[i][1];
                    int mcount = count + 1;
 
                    if (mx < 0 || mx >= H || my < 0 || my >= W) continue;
                    if (grid[mx][my] || visited[mx][my][mcount]) continue;
                    visited[mx][my][mcount] = 1;
                    monkey.push(make_pair(make_pair(mx, my), mcount));
                }
            }
 
            for (int i = 0; i < 4; i++)
            {
                int mx = x + dm[i][0];
                int my = y + dm[i][1];
                int mcount = count;
 
                if (mx < 0 || mx >= H || my < 0 || my >= W) continue;
                if (grid[mx][my] || visited[mx][my][mcount]) continue;
                visited[mx][my][mcount] = 1;
                monkey.push(make_pair(make_pair(mx, my), mcount));
            }
        }
        ans++;
    }
    return;
}
 
int main(void)
{
    cin >> K >> W >> H;
 
    for (int i = 0; i < H; i++)
    {
        for (int j = 0; j < W; j++)
        {
            cin >> grid[i][j];
        }
    }
 
    visited[0][0][0= 1;
    monkey.push(make_pair(make_pair(00), 0));
 
    bfs();
 
    if (flag) cout << ans;
    else cout << "-1";
 
    return 0;
}
cs


'Problem > BFS' 카테고리의 다른 글

[C/C++] BOJ 2234 :: 성곽  (0) 2019.02.18
[C/C++] BOJ 1938 :: 통나무 옮기기  (0) 2019.02.17
[C/C++] BOJ 3055 :: 탈출  (0) 2019.02.12
[C/C++] BOJ 1113 :: 수영장 만들기  (0) 2019.02.08
[C/C++] BOJ 1726 :: 로봇  (0) 2019.02.07