• HDU 1253 三维数组的图上找最短路


    题目大意:

    从三维空间的(0,0,0)出发到(a-1,b-1,c-1),每移动一个都要时间加一,计算最短时间

    根据六个方向,开个bfs,像spfa那样计算最短路径就行了,但是要1200多ms,也不知道有没有更好的方法

     1 #include <cstdio>
     2 #include <cstring>
     3 #include <iostream>
     4 #include <queue>
     5 using namespace std;
     6 int dp[52][52][52] , a , b , c;
     7 bool wall[52][52][52] , vis[52][52][52];
     8 int dir[6][3] = {{0,0,1} , {0,1,0} , {1,0,0} , {0,0,-1} , {0,-1,0} , {-1,0,0}};
     9 struct Node{
    10     int x , y , z;
    11     Node(int x = 0 , int y = 0 , int z = 0):x(x),y(y),z(z){}
    12 };
    13 queue<Node> q;
    14 
    15 bool ok(int x , int y , int z)
    16 {
    17     if(x<0 || x>=a) return false;
    18     if(y<0 || y>=b) return false;
    19     if(z<0 || z>=c) return false;
    20     if(wall[x][y][z]) return false;
    21     return true;
    22 }
    23 
    24 int main()
    25 {
    26   //  freopen("a.in" , "r" , stdin);
    27     int T , t , w;
    28     scanf("%d" , &T);
    29     while(T--){
    30         scanf("%d%d%d%d" , &a , &b , &c , &t);
    31         for(int i = 0 ; i<a ; i++)
    32             for(int j = 0 ; j<b ; j++)
    33                 for(int k = 0 ; k<c ; k++){
    34                     scanf("%d" , &w);
    35                     if(w) wall[i][j][k] = true;
    36                     else wall[i][j][k] = false;
    37                 }
    38         memset(dp , 0x3f , sizeof(dp));
    39         memset(vis , 0 , sizeof(vis));
    40         dp[0][0][0] = 0;
    41         q.push(Node(0,0,0));
    42         while(!q.empty()){
    43             Node u = q.front();
    44             q.pop();
    45             vis[u.x][u.y][u.z] = false;
    46             for(int i = 0 ; i<6 ; i++){
    47                 Node v;
    48                 v.x = u.x+dir[i][0];
    49                 v.y = u.y+dir[i][1];
    50                 v.z = u.z+dir[i][2];
    51                 if(ok(v.x,v.y,v.z)){
    52                     if(dp[v.x][v.y][v.z] > dp[u.x][u.y][u.z] + 1){
    53                         dp[v.x][v.y][v.z] = dp[u.x][u.y][u.z] + 1;
    54                         if(!vis[v.x][v.y][v.z]){
    55                             q.push(v);
    56                             vis[v.x][v.y][v.z] = true;
    57                         }
    58                     }
    59                 }
    60             }
    61         }
    62 
    63         if(dp[a-1][b-1][c-1] > t) puts("-1");
    64         else printf("%d
    " , dp[a-1][b-1][c-1]);
    65     }
    66     return 0;
    67 }
  • 相关阅读:
    Ubuntu 12.04 + nginx + php5 + phpfpm安装,并进行多站点配置
    PHP的FTP类
    php操作mongodb 分组排序
    mongodb 条件操作符
    PHP匿名登录FTP
    PHP连接到FTP服务器注意事项
    Java SE第二讲 原生数据类型Primitive Data Type
    java se 第五讲 运算符续
    Java SE 第一讲 入门jdk的下载安装
    Java SE第三讲:原生数据类型的使用陷阱
  • 原文地址:https://www.cnblogs.com/CSU3901130321/p/4184690.html
Copyright © 2020-2023  润新知