博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
HDU 1548 A strange lift (Dijkstra)
阅读量:5049 次
发布时间:2019-06-12

本文共 1748 字,大约阅读时间需要 5 分钟。

题意:

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

 

思路:

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

1 #include
2 #include
3 #include
4 #include
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

你可能感兴趣的文章
FreeMarker解析json数据
查看>>
Java8 Lambda表达应用 -- 单线程游戏server+异步数据库操作
查看>>
次序+“选择不重复的记录”(3)——最大记录
查看>>
Codeforces 450 C. Jzzhu and Chocolate
查看>>
[Unity3D]Unity3D游戏开发MatchTarget的作用攀登效果实现
查看>>
ACdream 1115 Salmon And Cat (找规律&amp;&amp;打表)
查看>>
JSON、JSONP、Ajax的区别
查看>>
AngularJS学习篇(一)
查看>>
关于Xshell无法连接centos6.4的问题
查看>>
css3动画——基本准则
查看>>
javaweb常识
查看>>
Java注解
查看>>
web自己主动保存表单
查看>>
一个小的日常实践——高速Fibonacci数算法
查看>>
机器学些技法(9)--Decision Tree
查看>>
drf权限组件
查看>>
输入月份和日期,得出是今年第几天
查看>>
Qt中子窗口全屏显示与退出全屏
查看>>
使用brew安装软件
查看>>
[BZOJ1083] [SCOI2005] 繁忙的都市 (kruskal)
查看>>