UVa 1600 Patrol Robot(BFS)

题意:

  给定一个n*m的图, 有一个机器人需要从左上角(1,1)到右下角(n,m), 网格中一些格子是空地, 一些格子是障碍, 机器人每次能走4个方向, 但不能连续穿越k(0<= k <= 20)个障碍物, 求最短路径, 如无法到达输出 -1。 

分析:

    对于空地, 建一个vis数组记录走过的空地, 然后每次碰到没vis过的空地都把队伍K更新为最大值, vis这块地。

  对于墙的情况, 我们可以建一个vis1数组去记录通过墙时候的k值, 如果之前有一个k值比现在要通过的大, 那么我们就不入队, 否则入队,入队k是队头k-1, 更新这堵墙的k值。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 const int maxn = 25;
 4 int G[maxn][maxn];
 5 int vis[maxn][maxn];
 6 int visk[maxn][maxn];
 7 int dx[] = {0,1,0,-1};//右下左上
 8 int dy[] = {1,0,-1,0};
 9 struct node{
10     int x,y, step, k;
11     node(int x, int y, int step, int k):x(x), y(y), step(step), k(k){}
12 };
13 int n, m, k;
14 bool vaild(int x, int y){
15     if(x < 0 || x >= n || y < 0 || y >= m)
16         return false;
17     return true;
18 }
19 int main(){
20 
21     int T;
22     scanf("%d", &T);
23     while(T--){
24         memset(G,0,sizeof(G));
25         memset(vis,0,sizeof(vis));
26         memset(visk,0,sizeof(visk));
27         scanf("%d %d", &n, &m);
28         scanf("%d", &k);
29         for(int i = 0; i < n; i++){
30             for(int j = 0; j < m; j++){
31                 scanf("%d", &G[i][j]);
32             }
33         }
34 
35 
36     int ok = 0;
37     queue<node> q;
38     q.push(node(0,0,0,k));
39     visk[0][0] = k;
40     vis[0][0] = 1;
41         int cnt = 0;
42         while(!q.empty()){
43             node t = q.front(); q.pop();
44 //            printf("%d %d %d %d\n", t.x,t.y, t.step, t.k);
45             if(t.x == n-1 && t.y == m-1){
46                 printf("%d\n",t. step );
47                 ok = 1;
48                 break;
49             }
50             for(int i = 0; i < 4; i++){
51                 int tx = t.x + dx[i];
52                 int ty = t.y + dy[i];
53                 if(vaild(tx,ty)){
54                     if(G[tx][ty] == 1){
55                         if( t.k - 1 >= 0 && visk[tx][ty] <= t.k - 1){
56 //                            if(!vis[tx][ty]){
57                                 q.push(node(tx,ty,t.step+1, t.k - 1));
58                                 visk[tx][ty] = t.k - 1;
59 //                                vis[tx][ty] = 1;
60 //                            }
61                         }
62                     }
63                     else {
64                         if(!vis[tx][ty]){
65                             q.push(node(tx,ty,t.step+1,k));
66                             vis[tx][ty] = 1;
67                         }
68                     }
69                 }
70             }
71         }
72         if(!ok) printf("-1\n");
73     }
74     return 0;
75 }

 

posted @ 2017-07-26 18:47  Neord  阅读(114)  评论(0编辑  收藏  举报