奇怪的电梯
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 10 Accepted Submission(s) : 5
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N)。电梯只有四个按钮:开、关、上、下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,相应的按钮就会失灵。例如:3 3 1 2 5代表了Ki(K1=3,K2=3,...),从一楼开始。在一楼,按“上”可以到4楼,按“下”是不起作用的,因为没有-2楼。那么,从A楼到B楼至少要按几次按钮呢?
Input
输入第一行为T,表示数据组数,对于每组数据的共二行,第1行为三个用空格隔开的正整数,表示N,A,B(1<=N<=200,1<=A,B<=N),第2行为N个用空格隔开的正整数,表示Ki。
Output
对于每组数据输出最少按键次数,若无法到达,输出-1。
Sample Input
1 5 1 5 3 3 1 2 5
Sample Output
3
思路分析:这是广搜的题目,主要在于它只有两个方向的搜索要用到结构体。
代码:#include<iostream> #include<string.h> #include<queue> #include<stdio.h> using namespace std; int t,n,a,b,flag; int move[300],visit[430]; struct tmp { int f;//为当前楼数 int step;//为步数 }; void bfs(tmp s) { int i; queue<tmp>q; //q.push(s); tmp s1,pp; for(q.push(s);!q.empty();q.pop()) { s1=q.front(); //s1.step=0; //s1.=s1.f+move[s1.f];//即楼数为当前楼数加上当前的要上的楼数。 if(s1.f==b) {printf("%d\n",s1.step); flag=1;} else { pp.f=s1.f-move[s1.f];//从当前相下运动 if(pp.f>=1&&pp.f<=n&&!visit[pp.f]) { visit[pp.f]=1; pp.step=s1.step+1; q.push(pp); } pp.f=s1.f+move[s1.f];//从当前向上运动。 if(pp.f>=1&&pp.f<=n&&!visit[pp.f]) { visit[pp.f]=1; pp.step=s1.step+1; q.push(pp); } } } } int main() { int i; scanf("%d",&t); while(t--) { flag=0; memset(visit,0,sizeof(visit)); scanf("%d%d%d",&n,&a,&b); for(i=1;i<=n;i++) scanf("%d",&move[i]); tmp pp; pp.step=0; pp.f=a; visit[a]=1; bfs(pp); if(!flag) printf("-1\n"); } return 0; }