您的位置:首页 > 其它

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: