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

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#define M 205
#define INF 0x3f3f3f3f
using namespace std;

int map[M][M];
int d[M], vis[M];
int n;
int b, e;

void Dijkstra(){
   memset(d, 0x3f, sizeof(d));
   memset(vis, 0, sizeof(vis));
   d[b]=0;
   vis[b]=1;
   int root=b;
   for(int j=1; j<n; ++j){
       int minLen=INF, p;
       for(int i=1; i<=n; ++i){
          if(!vis[i] && d[i] > d[root] + map[root][i])
              d[i] = d[root] + map[root][i];
          if(!vis[i] && minLen>d[i]){
             p=i;
             minLen=d[i];
          }
       }
       if(minLen==INF)
          return;
       root=p;
       vis[root]=1;
   }
}

int main(){
   while(cin>>n && n){
       cin>>b>>e;
       memset(map, 0x3f, sizeof(map));
       for(int i=1; i<=n; ++i){
          int x, xx;
          cin>>x;
          map[i][i]=0;// i+(-)x 表示 从第i层可以到达第 i+(-)x层
          xx=i-x;
          if(xx>=1) map[i][xx]=1;
          xx=i+x;
          if(xx<=n)  map[i][xx]=1;
       }
       Dijkstra();
       if(d[e]==INF)
          cout<<"-1"<<endl;
       else
          cout<<d[e]<<endl;
   }
   return 0;
}
/*
思路:当前电梯位置的两个方向进行搜索!
      注意:搜索时的界限, 用x表示将要到达的电梯的位置
            1. 首先是x>=1
            2. x<=n
            3. vis[x]!=0 表明bfs时候没有经过这个楼层
*/
#include<iostream>
#include<cstring>
#include<cstdio>
#include<queue>
using namespace std;
struct node{
   int x;
   int step;
   node(){}
   node(int x, int step){
      this->x=x;
      this->step=step;
   }
};
queue<node>q;
int n, b, e;
int f[205];
int vis[205];

bool bfs(){
    while(!q.empty())  q.pop();
    memset(vis, 0, sizeof(vis));
    q.push(node(b,0));
    vis[b]=1;
    while(!q.empty()){
        node cur=q.front();
        q.pop();
        if(cur.x==e){
            cout<<cur.step<<endl;
            return true;
        }
        int xx;
        xx=cur.x+f[cur.x];
        if(xx==e){
           cout<<cur.step+1<<endl;
           return true;
        }
        if(xx<=n && !vis[xx]){
           q.push(node(xx, cur.step+1));
           vis[xx]=1;
        }
        xx=cur.x-f[cur.x];
        if(xx==e){
           cout<<cur.step+1<<endl;
           return true;
        }
        if(xx>=1 && !vis[xx]){
           q.push(node(xx, cur.step+1));
           vis[xx]=1;
        }
    }
    return false;
}

int main(){
    while(cin>>n && n){
       cin>>b>>e;
       for(int i=1; i<=n; ++i)
          cin>>f[i];
       if(!bfs())
          cout<<"-1"<<endl;
    }
    return 0;
}
时间: 2024-11-02 12:34:43

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

HDU1548-A strange lift【广搜做法】

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

hdu 1548-HDU 1548的问题:A Strange Lift

问题描述 HDU 1548的问题:A Strange Lift HDU 1548"A Strange Lift"(电梯问题).本人刚学bfs和dfs还不会用STL库,就自己写了一个队列.自己测试了很多组数据觉得没有错误,但是提交上去就是Wrong Answer,检查了好多遍也检查不出问题.各位大神帮忙看一下我的代码哪里有错误或者漏洞,谢谢! #include<iostream>#include<cstdio>#include<cstring>usin

Dijkstra最短路径算法实现代码_C 语言

Dijkstra的最短路径算法是基于前驱顶点的最短路径计算的,整体上来讲还是比较简单的,下面是代码: 复制代码 代码如下: #include <iostream>#include <vector>#include <limits> void shortestpath( const std::vector <std::vector< short> >& paths, int from, std::vector< short>&a

Dijkstra最短路径算法[贪心]

Dijkstra算法的标记和结构与prim算法的用法十分相似.它们两者都会从余下顶点的优先队列中选择下一个顶点来构造一颗扩展树.但千万不要把它们混淆了.它们解决的是不同的问题,因此,所操作的优先级也是以不同的方式计算的:Dijkstra算法比较路径的长度,因此必须把边的权重相加,而prim算法则直接比较给定的权重. 源最短路径问题给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数.另外,还给定 V 中的一个顶点,称为源.现在我们要计算从源到所有其他各顶点的最短路径长度.这里的长度

hdu 1548 A strange lift

点击打开链接hdu 1548 思路:最短路+Dijkstra 分析:数据量不大直接Dijkstra即可,但是注意要把图处理成有向图,因为题目中的电梯是有分上下两个分向的. 代码: #include<iostream> #include<algorithm> #include<cstdio> #include<cstring> using namespace std; #define MAXN 210 #define INF 0xFFFFFFF int n ,

[算法系列之三十]Dijkstra单源最短路径算法

单源最短路径问题 给定一个带权有向图 G=(V,E) ,其中每条边的权是一个非负实数.另外,还给定 V 中的一个顶点,称为源.现在我们要计算从源到所有其他各顶点的最短路径长度.这里的长度是指路上各边权之和.这个问题通常称为单源最短路径问题. 前面Bellman-Ford最短路径算法讲了单源最短路径的Bellman-Ford算法(动态规划算法).这里介绍另外一个更常见的算法Dijkstra算法. Dijkstra算法和 最小生成树Prim算法最小生成树算法非常类似,大家可以先熟悉下个算法.两个算法

Dijkstra算法(二) C++详解

迪杰斯特拉算法介绍 迪杰斯特拉(Dijkstra)算法是典型最短路径算法,用于计算一个节点到其他节点的最短路径. 它的主要特点是以起始点为中心向外层层扩展(广度优先搜索思想),直到扩展到终点为止. 基本思想 通过Dijkstra计算图G中的最短路径时,需要指定起点s(即从顶点s开始计算). 此外,引进两个集合S和U.S的作用是记录已求出最短路径的顶点(以及相应的最短路径长度),而U则是记录还未求出最短路径的顶点(以及该顶点到起点s的距离). 初始时,S中只有起点s:U中是除s之外的顶点,并且U中

c语言-我感觉书上的dijkstra算法错了

问题描述 我感觉书上的dijkstra算法错了 大家看一下啊,那个第一次v等于0的时候 解决方案 Dijkstra算法有向加权图的最短路径算法-Dijkstra最短路径(Dijkstra算法) 解决方案二: n=0时错哪了?怎么说话说半截? 解决方案三: 如果第一次就是给v等于0呢,我感觉找不出来disk最小值

python编写的最短路径算法_python

一心想学习算法,很少去真正静下心来去研究,前几天趁着周末去了解了最短路径的资料,用python写了一个最短路径算法.算法是基于带权无向图去寻找两个点之间的最短路径,数据存储用邻接矩阵记录.首先画出一幅无向图如下,标出各个节点之间的权值. 其中对应索引: A --> 0 B--> 1 C--> 2 D-->3 E--> 4 F--> 5 G--> 6 邻接矩阵表示无向图: 算法思想是通过Dijkstra算法结合自身想法实现的.大致思路是:从起始点开始,搜索周围的路径