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;
}