HDU 1548 A strange lift (bfs / 最短路)
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)
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"?
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.
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".
0
#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 / 最短路)的更多相关文章
- HDU 1548 A strange lift (最短路/Dijkstra)
题目链接: 传送门 A strange lift Time Limit: 1000MS Memory Limit: 32768 K Description There is a strange ...
- hdu 1548 A strange lift (bfs)
A strange lift Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- hdu 1548 A strange lift
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=1548 A strange lift Description There is a strange li ...
- HDU 1548 A strange lift(最短路&&bfs)
A strange lift Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)To ...
- 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 ...
- 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 ...
- HDU 1548 A strange lift (Dijkstra)
A strange lift http://acm.hdu.edu.cn/showproblem.php?pid=1548 Problem Description There is a strange ...
- HDU 1548 A strange lift 搜索
A strange lift Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others) T ...
- HDU 1548 A strange lift (广搜)
题目链接 Problem Description There is a strange lift.The lift can stop can at every floor as you want, a ...
随机推荐
- [linux] Upgrading glibc for the GHOST Vulnerability
1> Test if the problem exists, code: #include <netdb.h> #include <stdio.h> #include & ...
- iOS - C 基本语法
1.数据类型 2.常量 1)凡是整数数字常量一律是 int 型. 2)typedef 和 define. typedef 定义类型, #define 只是字符串替换. 3)在编写整形常量时,可以在常量 ...
- nginx虚拟主机配置
nginx虚拟主机配置 虚拟主机的概念虚拟主机,就是把一台物理服务器划分成多个"虚拟"的服务器,每一个虚拟主机都可以有独立的域名和独立的目录nginx虚拟主机的配置nginx的 ...
- SAP无输入历史记录(已在本地数据开启历史记录)解决方法
SAP客户端已开启本地数据的历史记录,但是仍然没有录入记录,重装SAP无法解决问题,没有最近输入记录操作极为不方便,经研究表现出的问题特征如下:1.同一用户在另一台电脑使用SAP就有历史记录,到了本电 ...
- 在centos中安装jenkins master测试环境
在centos中安装jenkins 1)安装目录 pwd (/home/AAA) 2)检查java是否安装 [AAA@Centos_AAA jenkins]$ java -version j ...
- ubuntu忘记密码怎么办
刚安装了,ubuntu14.04,就想着,如果忘记登录密码,这可不好办,所以测试下开机,刚过bios显示画面,不停的点击,,键盘左边的shift键.(因为刚开始是采用按着不放的办法,结果不灵.所以我不 ...
- IIS6.0开启gzip压缩(来自百度)
IIS6.0开启gzip压缩 | 更新:2012-08-10 10:29 1 2 3 4 5 分步阅读 开启gzip可以极大的加速网站.有时压缩比率高达80%,近来测试了一下,最少都有40%以上,还是 ...
- zz转码问题
http://blog.csdn.net/tge7618291/article/details/7599902 主原创文章,未经博主允许不得转载. <&l ...
- git中通过实际操作来了解常用命令
基本的6个命令 常用的就下面6个命令,但是详细的可能有上百个命令. 还需要特别了解git的几个名词,workspace:工作区,Index/Stage:暂存区,Respository:本地仓库,Rem ...
- iOS开发UI篇—Quartz2D使用(截屏)
iOS开发UI篇—Quartz2D使用(截屏) 一.简单说明 在程序开发中,有时候需要截取屏幕上的某一块内容,比如捕鱼达人游戏.如图: 完成截屏功能的核心代码:- (void)renderInCont ...