• 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
    ", t.x,t.y, t.step, t.k);
    45             if(t.x == n-1 && t.y == m-1){
    46                 printf("%d
    ",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
    ");
    73     }
    74     return 0;
    75 }
  • 相关阅读:
    this
    git使用整个过程整理
    javaScript事件知识点
    charles-web端开发者实用功能点
    react native 添加第三方插件react-native-orientation(横竖屏设置功能 android)
    react native 运行项目下载gradle慢的解决办法
    移动端 滑动组件 slip
    高逼格 分页列表 bootstrap-table
    reactjs 接入数据模型以及markdown语法的支持
    react-native 环境搭建以及项目创建打包
  • 原文地址:https://www.cnblogs.com/Jadon97/p/7241350.html
Copyright © 2020-2023  润新知