HDU 1548 bfs(一维)
题意:电梯每层有一个不同的数字,例如第n层有个数字k,那么这一层只能上k层或下k层,
但是不能低于一层或高于n层,给定起点与终点,要求出最少要按几次键。
#include <iostream>
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
#define N 210
struct Node{
int time,flor;
Node(){}
Node(int _f,int _t){
flor = _f;time = _t;
}
};
queue<Node> q;
int k[N],vis[N];
int solve(int start,int end,int n){
while(!q.empty()) q.pop();
q.push(Node(start,0));
while(!q.empty()){
Node cur = q.front(); q.pop();
if(cur.flor==end) return cur.time;
int up = cur.flor + k[cur.flor];
int down = cur.flor - k[cur.flor];
int tim = cur.time + 1;
if(up<=n&&up>=1&&vis[up]==0){
q.push(Node(up,tim));
vis[up] = 1;
}
if(down<=n&&down>=1&&vis[down]==0){
q.push(Node(down,tim));
vis[down] = 1;
}
}
return -1;
}
void init(int n){
for(int i = 1;i<=n;i++)
vis[i] = k[i] = 0;
}
int main(){
int n,a,b;
while(~scanf("%d%d%d",&n,&a,&b)&&n){
init(n);
for(int i = 1;i<=n;i++) scanf("%d",&k[i]);
printf("%d\n",solve(a,b,n));
}
return 0;
}