HDU 1548 A strange lift (Dijkstra)

https://vjudge.net/problem/HDU-1548

题意:

电梯每层有一个不同的数字,例如第n层有个数字k,那么这一层只能上k层或下k层,但是不能低于一层或高于n层,给定起点与终点,要求出最少要按几次键。

 

思路:

可以用BFS,也可以用迪杰斯特拉算法。

 1 #include<iostream> 
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<vector>
 5 using namespace std;
 6 
 7 #define INF 100000000
 8 
 9 int n, A, B;
10 int map[205][205];
11 int vis[205];
12 int d[205];
13 int num[205];
14 
15 void Dijkstra()
16 {
17     memset(vis, 0, sizeof(vis));
18     for (int i = 1; i <= n; i++)
19     {
20         num[i] = map[A][i];
21     }
22     num[A] = 0;
23     vis[A] = 1;
24     for (int i = 1; i < n; i++)
25     {
26         int min = INF;
27         int pos;
28         for (int j = 1; j <= n; j++)
29         {
30             if (num[j] < min && !vis[j])
31             {
32                 pos = j;
33                 min = num[j];
34             }
35         }
36         if (min == INF)    break;
37         vis[pos] = 1;
38         for (int j = 1; j <= n; j++)
39         {
40             if (num[pos] + map[pos][j] < num[j] && !vis[j])
41                 num[j] = num[pos] + map[pos][j];
42         }
43     }
44     if (num[B] == INF)  printf("-1\n");
45     else printf("%d\n", num[B]);
46 }
47 
48 int main()
49 {
50     //freopen("D:\\txt.txt", "r", stdin);
51     int a;
52     while (scanf("%d", &n) && n)
53     {
54         scanf("%d%d", &A, &B);
55         for (int i = 1; i <= n; i++)
56         for (int j = 1; j <= n; j++)
57             map[i][j] = INF;
58         for (int i = 1; i <= n; i++)
59         {
60             scanf("%d", &a);
61             if (i + a <= n)
62                 map[i][i + a] = 1;
63             if (i - a >= 0)
64                 map[i][i - a] = 1; 
65         }
66         Dijkstra();
67     }
68     return 0;
69 }

 

转载于:https://www.cnblogs.com/zyb993963526/p/6388682.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值