hdu1548 A strange lift(bfs 或Dijkstra最短路径)

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<algorithm>
 4 #include<cstring>
 5 #define M 205
 6 #define INF 0x3f3f3f3f
 7 using namespace std;
 8
 9 int map[M][M];
10 int d[M], vis[M];
11 int n;
12 int b, e;
13
14 void Dijkstra(){
15    memset(d, 0x3f, sizeof(d));
16    memset(vis, 0, sizeof(vis));
17    d[b]=0;
18    vis[b]=1;
19    int root=b;
20    for(int j=1; j<n; ++j){
21        int minLen=INF, p;
22        for(int i=1; i<=n; ++i){
23           if(!vis[i] && d[i] > d[root] + map[root][i])
24               d[i] = d[root] + map[root][i];
25           if(!vis[i] && minLen>d[i]){
26              p=i;
27              minLen=d[i];
28           }
29        }
30        if(minLen==INF)
31           return;
32        root=p;
33        vis[root]=1;
34    }
35 }
36
37 int main(){
38    while(cin>>n && n){
39        cin>>b>>e;
40        memset(map, 0x3f, sizeof(map));
41        for(int i=1; i<=n; ++i){
42           int x, xx;
43           cin>>x;
44           map[i][i]=0;// i+(-)x 表示 从第i层可以到达第 i+(-)x层
45           xx=i-x;
46           if(xx>=1) map[i][xx]=1;
47           xx=i+x;
48           if(xx<=n)  map[i][xx]=1;
49        }
50        Dijkstra();
51        if(d[e]==INF)
52           cout<<"-1"<<endl;
53        else
54           cout<<d[e]<<endl;
55    }
56    return 0;
57 } 
 1 /*
 2 思路:当前电梯位置的两个方向进行搜索!
 3       注意:搜索时的界限, 用x表示将要到达的电梯的位置
 4             1. 首先是x>=1
 5             2. x<=n
 6             3. vis[x]!=0 表明bfs时候没有经过这个楼层
 7 */
 8 #include<iostream>
 9 #include<cstring>
10 #include<cstdio>
11 #include<queue>
12 using namespace std;
13 struct node{
14    int x;
15    int step;
16    node(){}
17    node(int x, int step){
18       this->x=x;
19       this->step=step;
20    }
21 };
22 queue<node>q;
23 int n, b, e;
24 int f[205];
25 int vis[205];
26
27 bool bfs(){
28     while(!q.empty())  q.pop();
29     memset(vis, 0, sizeof(vis));
30     q.push(node(b,0));
31     vis[b]=1;
32     while(!q.empty()){
33         node cur=q.front();
34         q.pop();
35         if(cur.x==e){
36             cout<<cur.step<<endl;
37             return true;
38         }
39         int xx;
40         xx=cur.x+f[cur.x];
41         if(xx==e){
42            cout<<cur.step+1<<endl;
43            return true;
44         }
45         if(xx<=n && !vis[xx]){
46            q.push(node(xx, cur.step+1));
47            vis[xx]=1;
48         }
49         xx=cur.x-f[cur.x];
50         if(xx==e){
51            cout<<cur.step+1<<endl;
52            return true;
53         }
54         if(xx>=1 && !vis[xx]){
55            q.push(node(xx, cur.step+1));
56            vis[xx]=1;
57         }
58     }
59     return false;
60 }
61
62 int main(){
63     while(cin>>n && n){
64        cin>>b>>e;
65        for(int i=1; i<=n; ++i)
66           cin>>f[i];
67        if(!bfs())
68           cout<<"-1"<<endl;
69     }
70     return 0;
71 }

hdu1548 A strange lift(bfs 或Dijkstra最短路径)

时间: 2024-10-12 22:50:26

hdu1548 A strange lift(bfs 或Dijkstra最短路径)的相关文章

hdu1548 A strange lift(bfs)

A B C D E F G C - A strange lift Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status Practice HDU 1548 Appoint description: System Crawler (2016-05-23) Description There is

HDU1548 A strange lift BFS 简单题

一个电梯有n层,每一层有一个数k[i],和2个按钮,UP和DOWN,表示从这一层可以到达i+k[i] 或i-k[i] . 给出a,b,问从a到b 最少需要按多少下按钮. 直接bfs. 1 #include<cstdio> 2 #include<queue> 3 #include<cstring> 4 using namespace std; 5 const int maxn=210; 6 int n,a,b; 7 int k[maxn]; 8 bool vis[maxn

HDU1548——A strange lift(最短路径:dijskstra算法)

A strange lift DescriptionThere is a strange lift.The lift can stop can at every floor as you want, and there is a number Ki(0 <= Ki <= N) on every floor.The lift have just two buttons: up and down.When you at floor i,if you press the button "U

hdu1548 A strange lift (简单bfs)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548 A strange lift Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 15974    Accepted Submission(s): 5973 Problem Description There is a strange l

hdu1548——A strange lift

A strange lift Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 12230    Accepted Submission(s): 4656 Problem Description There is a strange lift.The lift can stop can at every floor as you want

HDU1548:A strange lift

A strange lift Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/32768K (Java/Other) Total Submission(s) : 64   Accepted Submission(s) : 29 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description There is a strange lif

HDU 1548 A strange lift——BFS

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 #include <cmath> 6 #include <queue> 7 #define sc(x) scanf("%d",&(x)) 8 #define pf(x) printf("%d\n", x) 9 #def

Hdu 1548 A strange lift(BFS)

Problem地址:http://acm.hdu.edu.cn/showproblem.php?pid=1548 一道简单的bfs,适合新手.你现在所在的电梯层为一个节点,而你从这个节点可以拜访另外两个节点(电梯向上走为一个节点,电梯向下走有一个节点),而拜访的时候自然也要避免拜访重复,否则会陷入死循环. #include <iostream> #include <queue> using namespace std; const int maxn = 200+10; int N,

HDU1548A strange lift BFS水题

没啥好说的,注意一下,走过的楼层不能再走,否则会陷入循环 #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include <cstdlib> #inclu