A strange lift

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Problem Description
There 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 "UP" , you will go up Ki floor,i.e,you will go to the i+Ki th
floor,as the same, if you press the button "DOWN" , you will go down Ki
floor,i.e,you will go to the i-Ki th floor. Of course, the lift can't go up high
than N,and can't go down lower than 1. For example, there is a buliding with 5
floors, and k1 = 3, k2 = 3,k3 = 1,k4 = 2, k5 = 5.Begining from the 1 st
floor,you can press the button "UP", and you'll go up to the 4 th floor,and if
you press the button "DOWN", the lift can't do it, because it can't go down to
the -2 th floor,as you know ,the -2 th floor isn't exist.
Here comes the
problem: when you are on floor A,and you want to go to floor B,how many times at
least he has to press the button "UP" or "DOWN"?
 
Input
The input consists of several test cases.,Each test
case contains two lines.
The first line contains three integers N ,A,B( 1
<= N,A,B <= 200) which describe above,The second line consist N integers
k1,k2,....kn.
A single 0 indicate the end of the input.
 
Output
For each case of the input output a interger, the least
times you have to press the button when you on floor A,and you want to go to
floor B.If you can't reach floor B,printf "-1".
 
Sample Input
5 1 5
3 3 1 2 5
0
 
Sample Output
3
 
 
题目大意:
      有一个电梯,在不同的楼层,可以上升或下降的层数是不同的
       (例如第一层有一个整数3,说明他可以上升3层或者下降3层),
      现在给你一个起始位置和最终位置,问至少需要几步能够到达最终位置。
 
解题思路:
      该题可以用最短路,也可以用广搜来写
       最短路:需要注意的是这题是单向边
       bfs:每次只需要搜索两个方向
最短路算法:
 #include <stdio.h>
#include <string.h>
#include <algorithm>
using namespace std; const int inf = <<; int n;
int map[][];
int a[],cnt;
int vis[],cast[]; void Dijkstra(int s,int e) //迪杰斯特拉
{
int i,j,min,pos;
memset(vis,,sizeof(vis));
for(i = ; i<n; i++)
cast[i] = map[s][i];
cast[s] = ;
vis[s] = ;
for(i = ; i<n; i++)
{
min = inf;
for(j = ; j<n; j++)
{
if(cast[j]<min && !vis[j])
{
pos = j;
min = cast[j];
}
}
if(min == inf)
break;
vis[pos] = ;
for(j = ; j<n; j++)
{
if(cast[pos]+map[pos][j]<cast[j] && !vis[j])
cast[j] = cast[pos]+map[pos][j];
}
}
} int main()
{
int i,j,s,e,x,y;
while(~scanf("%d",&n),n)
{
scanf("%d%d",&s,&e);
s--,e--;
for(i = ; i<n; i++)
for(j = ; j<n; j++)
map[i][j] = inf;
for(i = ; i<n; i++) //单向边
{
scanf("%d",&a[i]);
if(i+a[i]<n) //上升
map[i][i+a[i]] = ;
if(i-a[i]>=) //下降
map[i][i-a[i]] = ;
}
Dijkstra(s,e);
printf("%d\n",cast[e]==inf?-:cast[e]);
} return ;
}

广搜 bfs:

 #include <stdio.h>
#include <string.h>
#include <algorithm>
#include <queue>
using namespace std; int a[]; // 在第i层可以上升和下降的层数
int f[]; // 记录步数
int n,x,y;
void bfs()
{
int b;
memset(f,,sizeof(f));
queue<int > q;
q.push(x);
f[x] = ;
if (x == y)
return ;
while (!q.empty())
{
b = q.front();
if (b+a[b] <= n && !f[b+a[b]]) // 判断上升之后是否满足条件
{
q.push(b+a[b]);
f[b+a[b]] = f[b] + ;
if (b+a[b] == y) // 到达之后直接跳出
return ;
}
if (b-a[b] > && !f[b-a[b]]) // 判断下降之后是否满足条件
{
q.push(b-a[b]);
f[b-a[b]] = f[b] + ;
if (b-a[b] == y) // 到达之后直接跳出
return ;
}
q.pop();
}
return ;
}
int main ()
{
int i,j;
while (scanf("%d",&n),n)
{
scanf("%d%d",&x,&y);
for (i = ; i <= n; i ++)
scanf("%d",&a[i]); bfs();
if (f[y] != )
printf("%d\n",f[y]-);
else
printf("-1\n");
}
return ;
}

HDU 1548 A strange lift (bfs / 最短路)的更多相关文章

  1. HDU 1548 A strange lift (最短路/Dijkstra)

    题目链接: 传送门 A strange lift Time Limit: 1000MS     Memory Limit: 32768 K Description There is a strange ...

  2. hdu 1548 A strange lift (bfs)

    A strange lift Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  3. hdu 1548 A strange lift

    题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1548 A strange lift Description There is a strange li ...

  4. HDU 1548 A strange lift(最短路&&bfs)

    A strange lift Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)To ...

  5. hdu 1548 A strange lift 宽搜bfs+优先队列

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548 There is a strange lift.The lift can stop can at ...

  6. HDU 1548 A strange lift(BFS)

    Problem Description There is a strange lift.The lift can stop can at every floor as you want, and th ...

  7. HDU 1548 A strange lift (Dijkstra)

    A strange lift http://acm.hdu.edu.cn/showproblem.php?pid=1548 Problem Description There is a strange ...

  8. HDU 1548 A strange lift 搜索

    A strange lift Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) T ...

  9. HDU 1548 A strange lift (广搜)

    题目链接 Problem Description There is a strange lift.The lift can stop can at every floor as you want, a ...

随机推荐

  1. HMI开发与控件

    =>控件是什么概念? 百度曰,控件是对数据和方法的封装.控件可以有自己的属性和方法.属性是控件数据的简单访问者. 对于HMI开发来说,使用控件可以快速获取到用户的交互(包括按下.释放.点击.拖动 ...

  2. Struts2之Action

    Struts2之Action MVC模式中需要有一个控制器来负责浏览器与服务器之间的通信,实现用户与服务器的交互.在Struts2框架中实现这一功能的是Action,它是整个框架最核心的部分.Acti ...

  3. consul的安装配置 一centos7环境

    centos7上consul的安装--新手笔记 环境 我用的是centos7, 用的是vmware 一 安装系统后首先要设置ip ifconfig eth0 →查看IP 不过输出的信息多一些 ifco ...

  4. 如何很好的使用Linq的Distinct方法

    Person1: Id=1, Name="Test1" Person2: Id=1, Name="Test1" Person3: Id=2, Name=&quo ...

  5. 深入浅出设计模式——抽象工厂模式(Abstract Factory)

    模式动机在工厂方法模式中具体工厂负责生产具体的产品,每一个具体工厂对应一种具体产品,工厂方法也具有唯一性,一般情况下,一个具体工厂中只有一个工厂方法或者一组重载的工厂方法.但是有时候我们需要一个工厂可 ...

  6. HQL 参数绑定、唯一结果、分页、投影总结(下)

    分页: 在用hibernate封装的分页方法前,我们先回顾一下,Oracle里面原生分页做法 --分页查询 --(pageNo-1)*pagesize=起始行 pageNo*pagesize=结束行 ...

  7. Extjs关于alert显示不出—异步问题

    对应extjs提示框不能正常显示,而使用js的本身提示框可以正常,但由于样式不统一,不是 好的解决方法. 解决该问题,要了解extjs异步原理. ext的提示框都是异步的,非阻塞模式的,浏览器js的提 ...

  8. 关于JSPatch热修复

    今天和同事聊到JSPatch热修复,我们来看下JSPatch,确实解决了APP升级的痛点. 刚好,已经有这么一个第三方平台实现了后台管理,全套服务(网址是:http://jspatch.com/),先 ...

  9. 查看rpm和war包内容

    解压rpm包的内容:(没有安装,就像解压tgz包一样rpm包)rpm2cpio *.rpm | cpio -div 解压war包的内容: jar -xvf project.war 解压到当前目录

  10. 无法用sysadmin权限的登录名登陆,sa密码忘了,管理员被锁在外面

    作为一名DBA,你的职责就是保证数据的安全,为了达到要求,你移除了BUILTIN\Administrators组,禁用了sa登录名,修改了服务器端口,删除了所有的sysadmin权限的登录名,你可以连 ...