HDU 1548 A strange lift

来源:互联网 发布:网络10条禁令 编辑:程序博客网 时间:2024/05/10 03:13

题意:

给你n<=200个k[i]表示电梯在第i层能选择向上升k[i]层或者向下降k[i]层,问你最少按几次才能从s层到e层,若不能到输出-1。

思路:

每层你能选择向上或者向下,而且每层最多到达一次(因为到达多次能产生的结果和到达一次能产生的结果是一样的)。所以理所当然地选择BFS。

#include<cstdio>#include<cstring>#include<queue>using namespace std;const int MAX=205;int n,a,b,k[MAX];bool vis[MAX];struct Node{int floor;int step;}u,v;int BFS(){queue<Node> Q;memset(vis,false,sizeof(vis));vis[a]=true;if(a+k[a]<=n){u.floor=a+k[a];u.step=1;Q.push(u);}if(a-k[a]>=1){u.floor=a-k[a];u.step=1;Q.push(u);}while(!Q.empty()){u=Q.front();Q.pop();if(u.floor==b) return u.step;vis[u.floor]=true;if(u.floor+k[u.floor]<=n&&vis[u.floor+k[u.floor]]==false){v.floor=u.floor+k[u.floor];v.step=u.step+1;Q.push(v);}if(u.floor-k[u.floor]>=1&&vis[u.floor-k[u.floor]]==false){v.floor=u.floor-k[u.floor];v.step=u.step+1;Q.push(v);}}return -1;}int main(){while(~scanf("%d",&n),n){scanf("%d%d",&a,&b);for(int i=1;i<=n;i++){scanf("%d",&k[i]);}if(a==b) printf("0\n");else printf("%d\n",BFS());}return 0;}


0 0