博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
E - A strange lift 【数值型BFS+上下方向】
阅读量:6587 次
发布时间:2019-06-24

本文共 2413 字,大约阅读时间需要 8 分钟。

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"? 

InputThe 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.OutputFor 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 53 3 1 2 50

Sample Output

3
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define ll long long#define inf 0x3fffffffusing namespace std;struct Node{ int floor; int step;};int f[205];int vis[205];int dir[2]={-1,1};int n,a,b;queue
q;int bfs(){ while(!q.empty()) q.pop(); q.push(Node{a,0}); while(!q.empty()) { Node tmp; Node u=q.front(); q.pop(); if(u.floor==b)//到达 { return u.step; } for(int i=0;i<2;i++) { tmp.floor=u.floor+f[u.floor]*dir[i]; tmp.step=u.step+1; if(tmp.floor>=1&&tmp.floor<=n&&!vis[tmp.floor]) { vis[tmp.floor]=1; q.push(tmp); } } } return -1;}int main(){ while(~scanf("%d",&n)&&n) { scanf("%d%d",&a,&b); memset(vis,0,sizeof(vis)); for(int i=1;i<=n;i++) scanf("%d",&f[i]); printf("%d\n",bfs()); } return 0;}
View Code

 

转载于:https://www.cnblogs.com/Roni-i/p/7406277.html

你可能感兴趣的文章
div中的相对定位与绝对定位(转)
查看>>
PHP 根据IP地址获取所在城市
查看>>
阅读演出信息
查看>>
BZOJ 1008: [HNOI2008]越狱
查看>>
远程连接powershell
查看>>
集成Struts2+Spring+Hibernate_两种方案
查看>>
CentOS 6.5下的lamp环境rsyslog+MySQL+loganalyzer实现日志集中分析管理
查看>>
使用fiddler模拟重复请求接口
查看>>
第八周
查看>>
Python 9 Redis
查看>>
Linux Shell编程
查看>>
福大软工1816 · 第六次作业 - 团队选题报告
查看>>
【node.js】mongodb<二>
查看>>
Spring定时器Quartz的用法
查看>>
ubuntu下打开终端插件
查看>>
(转) 报文格式【定长报文】
查看>>
Gradle 构建工具
查看>>
LeetCode OJ - construct Binary Tree from Inorder and Postorder/Preorder Traversal
查看>>
JavaScript知识点总结(命名规范,变量的作用域)
查看>>
js之简易计算器
查看>>