[最短路径、BFS] HDU 1548 - A strange lift
2015-02-11 23:29
447 查看
题意简述:
第一行输入三个整数N、A、B,分别代表楼的层数,开始楼层和结束楼层。
第二行输入N个整数,代表在当前楼层只能向上或向下移动的层数。
问从楼层A到楼层B至少需要按几次?如果不能到达,输出”-1”。
题目分析:
由题意可知,从楼层A开始,可以向上到达A+Ki(A+ki <= N)楼层,向下到达A-Ki楼层(A-Ki >= 1)。
并且每个楼层向上或向下到达的楼层是固定不变的。
由此可知,每个楼层最多需要访问一次,访问多次没有意义。
所以可以通过广度优先搜索来解决这个问题。
同时,此题也有另一种做法,设当前楼层能到达的楼层的距离为1。
两点距离以二维形式存储,然后用Dijkstra求A、B两点的最短路径即可。
第一行输入三个整数N、A、B,分别代表楼的层数,开始楼层和结束楼层。
第二行输入N个整数,代表在当前楼层只能向上或向下移动的层数。
问从楼层A到楼层B至少需要按几次?如果不能到达,输出”-1”。
题目分析:
由题意可知,从楼层A开始,可以向上到达A+Ki(A+ki <= N)楼层,向下到达A-Ki楼层(A-Ki >= 1)。
并且每个楼层向上或向下到达的楼层是固定不变的。
由此可知,每个楼层最多需要访问一次,访问多次没有意义。
所以可以通过广度优先搜索来解决这个问题。
同时,此题也有另一种做法,设当前楼层能到达的楼层的距离为1。
两点距离以二维形式存储,然后用Dijkstra求A、B两点的最短路径即可。
//BFS #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <algorithm> #include <iostream> #include <set> #include <map> #include <queue> #include <stack> #include <assert.h> #include <time.h> typedef long long LL; const int INF = 500000001; const double EPS = 1e-9; const double PI = acos(-1.0); using namespace std; int vis[205], dir[2] = {1, -1}, N, A, B, flag, a[205], len[205]; queue<int> qq; int bfs() { while(!qq.empty()) { int k = qq.front(); if(k == B) { return len[B]; } qq.pop(); for(int i = 0; i < 2; i++) { int tmp = k + dir[i] * a[k]; if(tmp >= 1 && tmp <= N && vis[tmp] == -1) { vis[tmp] = 0; qq.push(tmp); len[tmp] = len[k] + 1; } } } return -1; } int main() { #ifdef _T1est freopen("test0.in", "r", stdin); freopen("test0.out", "w", stdout); srand(time(NULL)); #endif while(~scanf("%d", &N), N) { scanf("%d %d", &A, &B); memset(vis, -1, sizeof(vis)); for(int i = 1; i <= N; i++) { scanf("%d", &a[i]); } len[A] = 0; vis[A] = 0; qq.push(A); printf("%d\n", bfs()); while(!qq.empty()) qq.pop(); } return 0; }
//Dijkstra #include <stdio.h> #include <string.h> #include <math.h> #include <stdlib.h> #include <algorithm> #include <iostream> #include <set> #include <map> #include <queue> #include <stack> #include <assert.h> #include <time.h> typedef long long LL; const int INF = 500000001; const double EPS = 1e-9; const double PI = acos(-1.0); using namespace std; int graph[205][205], dir[2] = {-1, 1}, vis[205], dis[205], N, A, B; void init() { for(int i = 0; i <= 200; i++) { for(int j = 0; j <= 200; j++) { if(i == j) graph[i][j] = 0; else graph[i][j] = INF; } } } void Dijkstra() { for(int i = 1; i <= N; i++) { dis[i] = graph[A][i]; vis[i] = 1; } vis[A] = 0; for(int i = 2; i <= N; i++) { int minn = INF, k = -1; for(int j = 1; j <= N; j++) { if(vis[j] && minn > dis[j]) { minn = dis[j]; k = j; } } if(k == -1) break; vis[k] = 0; for(int j = 1; j <= N; j++) { if(vis[j] && dis[k] + graph[k][j] < dis[j]) { dis[j] = dis[k] + graph[k][j]; } } } } int main() { #ifdef _T1est freopen("test0.in", "r", stdin); freopen("test0.out", "w", stdout); srand(time(NULL)); #endif int t; while(~scanf("%d", &N), N) { scanf("%d %d", &A, &B); init(); for(int i = 1; i <= N; i++) { scanf("%d", &t); for(int j = 0; j < 2; j++) { int tmp = i + dir[j] * t; if(tmp >= 1 && tmp <= N) { graph[i][tmp] = 1; } } } Dijkstra(); if(dis[B] == INF) puts("-1"); else printf("%d\n", dis[B]); } return 0; }
相关文章推荐
- HDU 1548 A strange lift (BFS或最短路)
- hdu 1548 A strange lift (bfs)
- A strange lift HDU 1548 queue BFS 简单 水题
- hdu 1548 A strange lift(bfs)
- HDU 1548 A strange lift【BFS】
- hdu 1548 A strange lift (BFS、Dijkstra)
- HDU 1548 A strange lift(最短路或BFS)
- HDU 1548 A strange lift(Dijkstra、BFS、DP)
- hdu 1548 A strange lift(水题,bfs)
- hdu 1548 A strange lift (BFS)
- HDU 1548 A strange lift(Dijkstra,简单BFS)
- HDU 1548 A strange lift(BFS)
- hdu1548 A strange lift(bfs 或Dijkstra最短路径)
- hdu 1548 A strange lift (bfs)
- 【BFS/Dijkstra】hdu 1548 A Strange Lift
- hdu 1548 A strange lift(搜索:BFS)
- hdu 1548 A strange lift(bfs||dijkstra)
- HDOJ 题目1548 A strange lift(最短路径Dijkstra)
- HDU 1548 A strange lift (BFS)
- hdu 1548 A strange lift (bfs、最短路)