1014 A strange lift

1014 A strange lift

题意:一电梯上只有up和down两个按钮,每一楼层又有一个number Ki, 对于第i层按上升键up可升上到i+k[i]层,按下降键down到达i-k[i]层,到达的楼层最高不能超过n层,最低不能小于1层对于给定的起点和终点,求需要按键的最少次数。

思路:求最短路径,把每一层都看作为一个节点,不断搜索,找到最短路径。

感想:主要还是记录下一次能够到达的楼层,记录下到过的楼层,问题比较典型,关键是对每个节点搜索判断。

#include<iostream>

#include<queue>

#include<stdio.h>

#include<string.h>

#include<math.h>

#include<algorithm>

using namespace std;

bool visit[210];

int n,start,e;

int flor[210][2];

struct node{

   int pos,times;

}temp,p;

queue<node>q;

int dfs(){

   memset(visit,false,sizeof(visit));

   while(!q.empty()){

       temp=q.front();

       q.pop();

       visit[temp.pos]=true;

       if(temp.pos==e)

           return temp.times;

       int up=flor[temp.pos][0],down=flor[temp.pos][1];

       if(up!=-1&&!visit[up]){

           p.pos=up;

           p.times=temp.times+1;

           q.push(p);

       }

       if(down!=-1&&!visit[down]){

           p.pos=down;

           p.times=temp.times+1;

           q.push(p);

       }

    }

    return -1;

}

int main(){

   while(cin>>n)

    {

       if(n==0)  break;

       cin>>start>>e;

   int i,f;

   memset(flor,-1,sizeof(flor));

   while(!q.empty())

       q.pop();

   for(i=1;i<=n;i++){

       cin>>f;

       temp.pos=i;

       flor[i][0]=flor[i][1]=-1;

       if(i+f<=n)

           flor[i][0]=i+f;

       if(i-f>0)

           flor[i][1]=i-f;

       if(i==start){

            temp.times=0;

            q.push(temp);

       }

    }

 

   printf("%d\n",dfs());

    }

   return 0;

}

你可能感兴趣的:(1014 A strange lift)