洛谷P1135 奇怪的电梯
2018-02-18 17:17
218 查看
题目描述
呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N)。电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3 3 1 2 5代表了Ki(K1=3,K2=3,……),从一楼开始。在一楼,按“上”可以到4楼,按“下”是不起作用的,因为没有-2楼。那么,从A楼到B楼至少要按几次按钮呢?输入输出格式
输入格式:输入文件共有二行,第一行为三个用空格隔开的正整数,表示N,A,B(1≤N≤200, 1≤A,B≤N),第二行为N个用空格隔开的非负整数,表示Ki。输出格式:输出文件仅一行,即最少按键次数,若无法到达,则输出-1。
输入输出样例
输入样例#1:5 1 5 3 3 1 2 5输出样例#1:
3看的像个搜索。。。实际上是个@¥%#¥#@¥spfa。。。附代码:#include<iostream>
#include<algorithm>
#include<cstdio>
#include<queue>
#define MAXN 210
#define MAX 999999999
using namespace std;
int n,s,t,c=1,head[MAXN],path[MAXN];
bool vis[MAXN];
struct node{
int next,to,w;
}a[MAXN<<1];
inline int read(){
int date=0,w=1;char c=0;
while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}
while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}
return date*w;
}
inline int relax(int u,int v,int w){
if(path[v]>path[u]+w){
path[v]=path[u]+w;
return 1;
}
return 0;
}
inline void add(int u,int v,int w){
a[c].to=v;a[c].w=w;
a[c].next=head[u];
head[u]=c++;
}
void spfa(){
int u,v;
queue<int> q;
for(int i=1;i<=n;i++){path[i]=MAX;vis[i]=false;}
path[s]=0;
vis[s]=true;
q.push(s);
while(!q.empty()){
u=q.front();
q.pop();
vis[u]=false;
for(int i=head[u];i;i=a[i].next){
v=a[i].to;
if(relax(u,v,a[i].w)&&!vis[v]){
vis[v]=true;
q.push(v);
}
}
}
printf("%d\n",path[t]==MAX?-1:path[t]);
}
int main(){
n=read();s=read();t=read();
for(int i=1;i<=n;i++){
int x=read();
if(i+x<=n)add(i,i+x,1);
if(i-x>=1)add(i,i-x,1);
}
spfa();
return 0;
}
相关文章推荐
- 洛谷 P1135 奇怪的电梯
- 洛谷 P1135 奇怪的电梯
- 洛谷p1135 奇怪的电梯
- 洛谷P1135 奇怪的电梯
- 洛谷 P1135 奇怪的电梯
- DP 洛谷 P1135 奇怪的电梯
- 洛谷 P1135 奇怪的电梯 (dfs)
- 洛谷P1135 奇怪的电梯
- 洛谷 P1135 奇怪的电梯
- 洛谷 P1135 奇怪的电梯 (搜索)
- 洛谷 奇怪的电梯 STL 版队列
- P1135 奇怪的电梯
- [洛谷1135]奇怪的电梯
- P1135 奇怪的电梯
- P1135 奇怪的电梯
- P1135 奇怪的电梯
- luogu P1135 奇怪的电梯
- 洛谷OJ - P1135 - 奇怪的电梯(DFS+回溯+减枝)
- P1135 奇怪的电梯
- 【洛谷 1135】 奇怪的电梯