题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548
题目大意:升降电梯,先给出n层楼,然后给出起始的位置,即使输出从A楼道B楼的最短时间。
注意的几点
(1)每次按一下,只能表示上或者是下,然后根据输入的看是上几层或者是下几层。
(2)注意不能到底不存在的楼层。
详见代码。
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 const int INF=9999999; 5 int map[205][205],node[205],vis[205],Min,n; 6 7 void set() 8 { 9 for (int i=1; i<=n; i++) 10 { 11 vis[i]=0; 12 node[i]=INF; 13 for (int j=1; j<=n; j++) 14 map[i][j]=INF; 15 } 16 } 17 18 int dijkstra(int m,int end) 19 { 20 int tm=m; 21 vis[m]=1; 22 node[m]=0; 23 for (int k=2; k<=n; k++) 24 { 25 Min=INF; 26 for (int i=1; i<=n; i++) 27 if (!vis[i]) 28 { 29 if (node[i]>node[tm]+map[tm][i]) 30 node[i]=node[tm]+map[tm][i]; 31 if (Min>node[i]) 32 { 33 Min=node[i]; 34 m=i; 35 } 36 } 37 vis[m]=1; 38 tm=m; 39 if(vis[end]) 40 return node[end]; 41 } 42 return -1; 43 } 44 45 int main () 46 { 47 int k; 48 while (scanf("%d",&n),n) 49 { 50 set(); 51 int a,b; 52 scanf("%d%d",&a,&b); 53 for (int i=1; i<=n; i++) 54 { 55 scanf("%d",&k); 56 if (i+k<=n) 57 map[i][i+k]=1; 58 if (i-k>=1) 59 map[i][i-k]=1; 60 } 61 printf ("%d\n",dijkstra(a,b)); 62 } 63 return 0; 64 }
hdu 1548 A strange lift (dijkstra算法)
时间: 2024-10-09 22:40:46