짱아의 개발 기록장

백준 1600번. 말이 되고픈 원숭이(c++) / BFS 본문

Algorithm/Baekjoon

백준 1600번. 말이 되고픈 원숭이(c++) / BFS

jungahshin 2021. 4. 5. 16:49
반응형

방문처리가 핵심인 BFS문제였다.

그냥 (x, y)로만 방문처리를 해주면, 더 빠른 길인데도 불구하고 누락되는 경우가 생긴다.

따라서, 말로 몇 번 이동했는지를 인자값으로 하나 더 넣어주었다. => visited[x좌표][y좌표][말 이동 횟수]

 

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
// 말이 되고픈 원숭이
#include <iostream>
#include <queue>
#include <tuple>
 
using namespace std;
 
int k, w, h;
int chess[201][201= {0, };
int hx[8= {-2-12121-1-2};
int hy[8= {1212-1-2-2-1};
int dx[4= {00-11};
int dy[4= {-1100};
 
int move()
{
    queue<tuple<intintintint>> q;
    q.push(make_tuple(0000));
    int visited[201][201][31= {0, };
 
    while(!q.empty()){
        int x, y, cnt, horseMove;
        tie(x, y, cnt, horseMove) = q.front();
        visited[x][y][horseMove] = true;
        q.pop();
 
        if(x==h-1 && y==w-1){
            return cnt;
        }
 
        if(horseMove+1<=k){
            for(int i=0; i<8; i++){
                int nx = x+hx[i];
                int ny = y+hy[i];
                if(0<=nx && nx<&& 0<=ny && ny<&& !visited[nx][ny][horseMove+1]){
                    if(chess[nx][ny]==0){
                        visited[nx][ny][horseMove+1= true;
                        q.push(make_tuple(nx, ny, cnt+1, horseMove+1));
                    }
                }
            }            
        }
 
        for(int i=0; i<4; i++){
            int nx = x+dx[i];
            int ny = y+dy[i];
            if(0<=nx && nx<&& 0<=ny && ny<&& !visited[nx][ny][horseMove]){
                if(chess[nx][ny]==0){
                    visited[nx][ny][horseMove] = true;
                    q.push(make_tuple(nx, ny, cnt+1, horseMove));
                }
            }
        }
    }
 
    return -1;
}
 
int main()
{
    cin>>k>>w>>h;
    for(int i=0; i<h; i++){
        for(int j=0; j<w; j++){
            cin>>chess[i][j];
        }
    }
 
    cout<<move()<<"\n";
    return 0;
}
cs
반응형
Comments