HDU 1548 A strange lift
2015-07-14 09:54
260 查看
Total Submission(s) : 11 Accepted Submission(s) : 3
[align=left]Problem Description[/align]
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"?
[align=left]Input[/align]
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.
[align=left]Output[/align]
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".
[align=left]Sample Input[/align]
[align=left]Sample Output[/align]
[align=left]Problem Description[/align]
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"?
[align=left]Input[/align]
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.
[align=left]Output[/align]
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".
[align=left]Sample Input[/align]
5 1 5 3 3 1 2 5 0
[align=left]Sample Output[/align]
3
#include<cstdio> #include<queue> #include<cstring> using namespace std; #define maxn 250 bool visit[maxn]; int floor[maxn][2]; int n,start,eee; struct node { int pos,t; }temp,p; queue<node> q; int BFS() { memset(visit,false,sizeof(visit)); while(!q.empty()) { temp=q.front(); q.pop(); visit[temp.pos]=true; if(temp.pos==eee) return temp.t; int up=floor[temp.pos][0],down=floor[temp.pos][1]; if(up!=-1&&!visit[up]) { p.pos=up; p.t=temp.t+1; q.push(p); } if(down!=-1&&!visit[down]) { p.pos=down; p.t=temp.t+1; q.push(p); } } return -1; } int main() { while(scanf("%d",&n),n) { scanf("%d %d",&start,&eee); memset(floor,-1,sizeof(floor)); while(!q.empty()) q.pop(); for(int i=1;i<=n;i++) { int t; scanf("%d",&t); temp.pos=i; floor[i][0]=floor[i][1]=-1; if(i+t<=n) floor[i][0]=i+t; if(i-t>=1) floor[i][1]=i-t; if(i==start) { temp.t=0; q.push(temp); } } temp=q.front(); printf("%d\n",BFS()); } return 0; }
相关文章推荐
- kettle实现文本文件数据抽取方法
- AD域和LDAP协议
- 线程之间共享数据(两个线程之间使用同一份数据),线程锁要统一,不统一的话会出现线程安全问题
- char TCHAR WCHAR区别 与 转换
- NSError 之 code 对照表
- HDU 1728 逃离迷宫
- poj 2479 最大连续子段和
- .net 服务器端文件下载
- Mysql主从配置,实现读写分离
- Android版xx助手之天天酷跑外挂详细分析
- 自动调整linux系统时间和时区与Internet时间同步
- Grails开发环境的快速搭建
- WET Dilutes Performance Bottlenecks
- 服务器.htaccess 详解以及 .htaccess 参数说明
- cef network-settings
- C# in depth (第一章 C#开发的进化史)
- LeetCode:Single NumberⅡ
- libevent安装及使用
- JS限制用户只能输入数字
- 四年了, 一个java程序员的总结