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
- A strange lift hdu 1548
- HDU 1548 A strange lift
- HDU 1548 A strange lift
- HDU 1548 A strange lift
- Hdu-1548 A strange lift
- HDU 1548 A strange lift
- HDU-1548-A strange lift
- hdu 1548 A strange lift
- HDU 1548-A strange lift
- HDU 1548 A strange lift
- hdu 1548 A strange lift
- hdu 1548 A strange lift
- HDU 1548 A strange lift
- hdu 1548 a strange lift
- HDU 1548 A strange lift
- HDU 1548 A strange lift
- hdu 1548 A strange lift
- hdu 1548 A strange lift
- 如何解决兼容性问题
- 物联网常用协议比较
- 不可变集合NSSet
- VS2010 openCV3.0 配置问题
- 【杭电 1286】找新朋友
- HDU 1548 A strange lift
- 每日一得--sql注入、xss攻击、csrf攻击防御
- java-并发-并发容器(4)
- Eclipse SVN插件比较 Subclipse vs Subversive
- IP分片与重组详解
- POJ 2524 Ubiquitous Religions
- 逻辑运算符的短路特性
- malloc,ralloc,calloc的区别
- 数据同步算法(rsync和RDC)