Coding Is My Life

코딩은 인생

그래프 이론/BFS, DFS 알고리즘

[백준/C++][말이 되고픈 원숭이 - 1600번]

산기대 컴공 2021. 11. 25. 04:27
728x90

문제 해결

일반적으로 사용하는 bfs 케이스(상하좌우)에 체스 말 케이스를 추가해서 12가지의 케이스를 고려해서 bfs 코드르 작성하렸다.

여기서 주위해야될 점은 체스말로 이동한 곳은 따로 visit를 해야된다.

visit을 할때 그곳이 k가 0~30번까지 올 수 있기 때문이다. 

 

코드

 

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
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <cstdio>
#include <cstring>
using namespace std;
int map[201][201];
int w,h,k,min_cnt = 987654321;
int case_x[8= {-2,2,-1,1,-2,2,-1,1};
int case_y[8= {-1,-1,-2,-2,1,1,2,2};
bool visit[201][201][30];
int case_x2[4= {0,0,-1,1};
int case_y2[4= {-1,1,0,0};
bool ck(int y,int x){
    if(x<0 || y<0 || x>=|| y>=h){return false;}
    else if(map[y][x] == 1){return false;}
    else{return true;}
}
void bfs(int y,int x,int cnt_k){
    queue<int> dx,dy,dc,dk;
    int cnt = 0;
    dx.push(x);
    dy.push(y);
    dc.push(cnt);
    dk.push(cnt_k);
    while(!dy.empty()){
        y = dy.front();
        dy.pop();
        x = dx.front();
        dx.pop();
        cnt = dc.front();
        dc.pop();
        cnt_k = dk.front();
        dk.pop();
        if(y == h-1 && x == w-1){
            min_cnt = min(min_cnt,cnt);
            continue;
        }
        else if(visit[y][x][cnt_k]){continue;}
        else{visit[y][x][cnt_k] = true;}
        int temp_x = x,temp_y = y;
        if(cnt_k < k){
            for(int i = 0;i<8;i++){
                x = temp_x+case_x[i];
                y = temp_y+case_y[i];
                if(ck(y,x)){
                    dx.push(x);
                    dy.push(y);
                    dc.push(cnt+1);
                    dk.push(cnt_k+1);
                }
            }
        }
        for(int i = 0;i<4;i++){
            x = temp_x+case_x2[i];
            y = temp_y+case_y2[i];
            if(ck(y,x)){
                dx.push(x);
                dy.push(y);
                dc.push(cnt+1);
                dk.push(cnt_k);
            }
        }
    }
}
int main(void){
    cin >> k;
    cin >> w >> h;
    for(int i = 0;i<h;i++){
        for(int j = 0;j<w;j++){
            cin >> map[i][j];
        }
    }
    memset(visit,false,sizeof(visit));
    bfs(0,0,0);
    if(min_cnt == 987654321){cout << "-1";}
    else{cout << min_cnt;}
}
cs
728x90