A strange lift
2016-04-19 21:51
295 查看
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"?
[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
题意:一个楼层有N层,通过电梯从A层到B层,电梯每层(i)只能选择向上和向下,并且为固定的k[i](向上或向下),问问至少多少次能够从A层到B层,如果不能到达,输出-1
思路:求最优解法,选择BFS
代码:
#include<queue>
#include<string.h>
#include<iostream>
using namespace std;
const int num = 255;
int floor[num][2];//表示上下楼
bool vis[num];//标识楼层是否到达过
//定义楼层
struct node{
int pos;//楼层
int cen;//积累到达该层移动的次数
};
node temp;
queue<node> q;
int N,A,B;
int BFS(){
memset(vis,false,sizeof(vis));
while(!q.empty()){
temp = q.front();
q.pop();
vis[temp.pos] = true;
if(temp.pos == B){
return temp.cen;
}
int up = floor[temp.pos][0];
int down = floor[temp.pos][1];
node temp2;
if(up != -1 && !vis[up]){
temp2.pos = up;
temp2.cen = temp.cen + 1;
q.push(temp2);
}
if(down != -1 && !vis[down]){
temp2.pos = down;
temp2.cen = temp.cen + 1;
q.push(temp2);
}
}
return -1;
}
int main(){
while(cin >> N && N){
cin >> A >> B;
memset(floor,-1,sizeof(floor));
//清空队列
while(!q.empty())
q.pop();
for(int i = 1;i <= N;i ++){
int t = 0;
cin >> t;
temp.pos = i;
if(i + t <= N){
//上升后到达的层数
floor[i][0] = t + i;
}
if(i - t >= 1){
//下降后到达的层数
floor[i][1] = i - t;
}
if(i == A){
temp.cen = 0;
q.push(temp);
}
}
int num = BFS();
cout << num << endl;
}
return 0;
}
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
题意:一个楼层有N层,通过电梯从A层到B层,电梯每层(i)只能选择向上和向下,并且为固定的k[i](向上或向下),问问至少多少次能够从A层到B层,如果不能到达,输出-1
思路:求最优解法,选择BFS
代码:
#include<queue>
#include<string.h>
#include<iostream>
using namespace std;
const int num = 255;
int floor[num][2];//表示上下楼
bool vis[num];//标识楼层是否到达过
//定义楼层
struct node{
int pos;//楼层
int cen;//积累到达该层移动的次数
};
node temp;
queue<node> q;
int N,A,B;
int BFS(){
memset(vis,false,sizeof(vis));
while(!q.empty()){
temp = q.front();
q.pop();
vis[temp.pos] = true;
if(temp.pos == B){
return temp.cen;
}
int up = floor[temp.pos][0];
int down = floor[temp.pos][1];
node temp2;
if(up != -1 && !vis[up]){
temp2.pos = up;
temp2.cen = temp.cen + 1;
q.push(temp2);
}
if(down != -1 && !vis[down]){
temp2.pos = down;
temp2.cen = temp.cen + 1;
q.push(temp2);
}
}
return -1;
}
int main(){
while(cin >> N && N){
cin >> A >> B;
memset(floor,-1,sizeof(floor));
//清空队列
while(!q.empty())
q.pop();
for(int i = 1;i <= N;i ++){
int t = 0;
cin >> t;
temp.pos = i;
if(i + t <= N){
//上升后到达的层数
floor[i][0] = t + i;
}
if(i - t >= 1){
//下降后到达的层数
floor[i][1] = i - t;
}
if(i == A){
temp.cen = 0;
q.push(temp);
}
}
int num = BFS();
cout << num << endl;
}
return 0;
}
相关文章推荐
- 站立会议第一天
- bzoj4537: [Hnoi2016]最小公倍数
- 这次栽倒在sscanf函数上------ 看看错误的语句:int nRet = sscanf("xxx=yyy", "%s=%s", szKey, szValue);
- 31.JAVA编程思想——JAVA IO系统输入和输出
- curl 命令常用
- 异常
- 30.JAVA编程思想——违例匹配
- 静态链表
- 2-SAT学习笔记
- 16.4.19 杭州某创业公司前端开发实习生面试分享(大神勿入)
- FZU 2151 OOXX Game
- G-Prime Generator|埃式筛法
- ACM刷题之HDU————hide handkerchief
- ZOJ 3430 Detect the Virus
- 冲刺阶段第二天
- 29.JAVA编程思想——构建器
- 28.JAVA编程思想——用finally清除
- 轻量级java ee企业应用实战第4版 源码下载
- Runner站立会议01
- 正则2016/4/19