-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathmain.cpp
More file actions
74 lines (71 loc) · 1.9 KB
/
Copy pathmain.cpp
File metadata and controls
74 lines (71 loc) · 1.9 KB
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
#include <iostream>
#include <queue>
#define INF 987654321
#define MAX_SIZE 201
#define MAX_K 31
using namespace std;
typedef struct _Point{
int r, c;
int movement;
int k_used;
}Point;
queue<Point> q;
int K, W, H, ret;
int map[MAX_SIZE][MAX_SIZE];
bool visited[MAX_SIZE][MAX_SIZE][MAX_K];
int dr[] = {0, 0, 1, -1};
int dc[] = {1, -1, 0, 0};
int hdr[] = {-2, -1, -2, -1, 2, 1, 2, 1};
int hdc[] = {-1, -2, 1, 2, 1, 2, -1, -2};
bool isSafe(int r, int c) {
return (0 <= r && r < H && 0 <= c && c < W);
}
void bfs() {
while(!q.empty()) {
int r = q.front().r;
int c = q.front().c;
int movement = q.front().movement;
int k_used = q.front().k_used;
q.pop();
if(r == H-1 && c == W-1) {
if(ret > movement) ret = movement;
continue;
}
// K-USE
if(k_used < K) {
for(int d=0; d<8; d++) {
int nr = r + hdr[d];
int nc = c + hdc[d];
if(!isSafe(nr, nc)) continue;
if(visited[nr][nc][k_used+1] || map[nr][nc] == 1) continue;
visited[nr][nc][k_used+1] = true;
q.push(Point{nr, nc, movement+1, k_used+1});
}
}
// normal move
for(int d=0; d<4; d++) {
int nr = r + dr[d];
int nc = c + dc[d];
if(!isSafe(nr, nc)) continue;
if(visited[nr][nc][k_used] || map[nr][nc] == 1) continue;
visited[nr][nc][k_used] = true;
q.push(Point{nr, nc, movement+1, k_used});
}
}
}
int main() {
cin >> K;
cin >> W >> H;
for(int i=0; i<H; i++) {
for(int j=0; j<W; j++) {
cin >> map[i][j];
}
}
ret = INF;
q.push(Point{0,0,0,0});
visited[0][0][0] = true;
bfs();
if(ret == INF) cout << "-1\n";
else cout << ret << '\n';
return 0;
}