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\n" , dp[a-1][b-1][c-1]);
65     }
66     return 0;
67 }
时间: 2024-10-20 12:06:16

HDU 1253 三维数组的图上找最短路的相关文章

HDU 2147 kiki&#39;s game(博弈图上找规律)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2147 题目大意:给你一个n*m的棋盘,初始位置为(1,m),两人轮流操作,每次只能向下,左,左下这三个方向移动,谁最后无法移动棋子就输掉比赛,问先手是否会获胜. 解题思路:简单题,P/N分析找规律,以(n,m)点为结束点推到起始点,如图: 发现每个田字格的状态都是一样的,因为(n,m)点一定时P态,所以可以得出规律:只有当(m%2==1&&n%2==1)时,先手才会输. 代码: 1 #incl

uva 116 Unidirectional TSP(动态规划,多段图上的最短路)

这道题目并不是很难理解,题目大意就是求从第一列到最后一列的一个字典序最小的最短路,要求不仅输出最短路长度,还要输出字典序最小的路径. 这道题可以利用动态规划求解.状态定义为: cost[i][j] = max{cost[i+1][j+k]+c[i][j]}(k=-1,0,1) 关于最短路长度的求法,我们可以通过上边的状态转移方程递推求解.cost代表从第i列到第c-1列的最短路,只要找出cost[0][j](j代表行号)中的最大值,我们得到的结果就是最短路. 我们已经得到了最短路的长度.下一步,

hdu 5876 Sparse Graph 无权图bfs求最短路

Sparse Graph Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others) Problem Description In graph theory, the complement of a graph G is a graph H on the same vertices such that two distinct vertices of H are adjacent if

poj 3249 Test for Job 图上dp(记忆化搜索)

题意: 给一个n个点的DAG,每个点有一个值p,现在要在图上找一个入度为0到出度为0的路径,使路径上的点的p值和最大. 分析: dp[v]记录以点v为起点能获得的最大值,搜一遍即可. 代码: //poj 3249 //sep9 #include <iostream> using namespace std; const int maxN=100024; const int maxM=1000024; int n,m,e; int p[maxN],head[maxN],dp[maxN],vis[

HDU 1253:胜利大逃亡(简单三维BFS)

胜利大逃亡 Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 24937    Accepted Submission(s): 9535 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的

HDU 1253 (简单三维广搜) 胜利大逃亡

奇葩!这么简单的广搜居然爆内存了,而且一直爆,一直爆,Orz 而且我也优化过了的啊,尼玛还是一直爆! 先把代码贴上睡觉去了,明天再来弄 1 //#define LOCAL 2 #include <iostream> 3 #include <cstdio> 4 #include <cstring> 5 #include <queue> 6 #include <cmath> 7 using namespace std; 8 9 struct Poin

[ACM] hdu 1253 胜利大逃亡 (三维BFS)

胜利大逃亡 Problem Description Ignatius被魔王抓走了,有一天魔王出差去了,这可是Ignatius逃亡的好机会. 魔王住在一个城堡里,城堡是一个A*B*C的立方体,可以被表示成A个B*C的矩阵,刚开始Ignatius被关在(0,0,0)的位置,离开城堡的门在(A-1,B-1,C-1)的位置,现在知道魔王将在T分钟后回到城堡,Ignatius每分钟能从一个坐标走到相邻的六个坐标中的其中一个.现在给你城堡的地图,请你计算出Ignatius能否在魔王回来前离开城堡(只要走到出

hdu 5001 概率DP 图上的DP

http://acm.hdu.edu.cn/showproblem.php?pid=5001 当时一看是图上的就跪了 不敢写,也没退出来DP方程 感觉区域赛的题  一则有一个点难以想到 二则就是编码有点难度. 这个题: 我一直的思路就是1-能到达i的概率 就是不能到达i的概率,然后三维方程巴拉巴拉,,,,把自己搞迷糊 正确做法: dp[k][j]   经过j步到达k点 并且不经过i点的概率 这么设的原因是,就可以求不能到达i点的概率了.   不能到达i点的概率就是segma(dp[v][j-1]

python 三维数组找最小值

#声明三维数组 num=[[[33,45,67],[23,71,66],[55,38,66]], [[21,9,15],[38,69,18],[90,101,89]]] value=num[0][0][0]#设置main为num数组的第一个元素 for i in range(2): for j in range(3): for k in range(3): if(value>=num[i][j][k]): value=num[i][j][k] #利用三重循环找出最小值 print("最小值