标签:
5 5 4 1 2 2 2 4 1 3 4 5 5 4 1 1 1 5 5
3
1 #include <stdio.h> 2 #include <string.h> 3 #include <math.h> 4 #include <queue> 5 #define INF 100000 6 using namespace std; 7 8 int map[25][25], have_run[25][25], m, n, k; 9 int dir[4][2] = {{1,0},{-1,0},{0,1},{0,-1}}; 10 11 struct node{ 12 int x, y, step; 13 }s, e; 14 15 int ok(int x, int y, int step){ 16 if(x < 1 || y < 1 || x > m || y > n || step > have_run[x][y]) 17 return 0; 18 return 1; 19 } 20 21 void bfs(){ 22 queue <node> Q; 23 node p, q; 24 p.x = s.x; 25 p.y = s.y; 26 p.step = 0; 27 Q.push(p); 28 while(!Q.empty()){ 29 q = Q.front(); 30 Q.pop(); 31 node into; 32 if(q.x == e.x && q.y == e.y){ 33 printf("%d\n", q.step); 34 return ; 35 } 36 for(int i = 0; i < 4; i++){ 37 into.x = q.x + dir[i][0]; 38 into.y = q.y + dir[i][1]; 39 into.step = q.step + 1; 40 if(ok(into.x, into.y, into.step)){ 41 int flow = 0; 42 if(!map[into.x][into.y]){ 43 if(into.step <= have_run[into.x][into.y]){ 44 have_run[into.x][into.y] = into.step; 45 Q.push(into); 46 continue; 47 } 48 } 49 while(map[into.x][into.y]){ 50 int tx = map[into.x][into.y] * dir[i][0]; 51 int ty = map[into.x][into.y] * dir[i][1]; 52 into.x += tx; 53 into.y += ty; 54 if(into.x < 1){ 55 into.x = 1; 56 break; 57 } 58 if(into.x > m){ 59 into.x = m; 60 break; 61 } 62 if(into.y < 1){ 63 into.y = 1; 64 break; 65 } 66 if(into.y > n){ 67 into.y = n; 68 break; 69 } 70 if(into.step <= have_run[into.x][into.y]){ 71 have_run[into.x][into.y] = into.step; 72 } 73 else{ 74 flow = 1; 75 break; 76 } 77 } 78 if(flow == 0){ 79 Q.push(into); 80 } 81 } 82 } 83 } 84 printf("Oh my Hubro QVQ\n"); 85 } 86 87 int main(){ 88 while(scanf("%d%d", &m, &n) != EOF){ 89 scanf("%d", &k); 90 memset(map, 0, sizeof(map)); 91 for(int i = 0; i < 23; i++){ 92 for(int j = 0; j < 23; j++){ 93 have_run[i][j] = INF; 94 } 95 } 96 for(int i = 0; i < k; i++){ 97 int a, b, c; 98 scanf("%d%d%d", &a, &b, &c); 99 map[a][b] = c; 100 } 101 scanf("%d%d%d%d", &s.x, &s.y, &e.x, &e.y); 102 bfs(); 103 } 104 }
标签:
原文地址:http://www.cnblogs.com/hsq666/p/4574555.html