Problem D: 电梯
Time Limit: 1 Sec Memory Limit: 128 MBSubmit: 124 Solved: 39
[Submit][Status][Web Board]
Description
一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第i层楼(1<=i<=N)上有一个数字Ki(0<=Ki<=N)。
电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,
相应的按钮就会失灵。例如:3 3 1 2 5代表了Ki(K1=3,K2=3,……),从一楼开始。在一楼,按“上”可以到
4楼,按“下”是不起作用的,因为没有-2楼。那么,从A楼到B楼至少要按几次按钮呢?
电梯只有四个按钮:开,关,上,下。上下的层数等于当前楼层上的那个数字。当然,如果不能满足要求,
相应的按钮就会失灵。例如:3 3 1 2 5代表了Ki(K1=3,K2=3,……),从一楼开始。在一楼,按“上”可以到
4楼,按“下”是不起作用的,因为没有-2楼。那么,从A楼到B楼至少要按几次按钮呢?
Input
每组数据,共有二行,第一行为三个用空格隔开的正整数,表示N,A,B(1≤N≤200, 1≤A,B≤N)
第二行为N个用空格隔开的正整数,表示Ki。
第二行为N个用空格隔开的正整数,表示Ki。
Output
每组数据,输出一行,即最少按键次数,若无法到达,则输出-1。
Sample Input
5 1 5
3 3 1 2 5
Sample Output
3
HINT
1 #include <iostream> 2 using namespace std; 3 int head=1,tail=1,q[200]; 4 int cg[200][200]; 5 int step[200]; 6 int book[200]; 7 int main(){ 8 int k[200]; 9 int n,a,b; 10 cin>>n>>a>>b; 11 for(int i=1;i<=n;i++) 12 { 13 cin>>k[i]; 14 } 15 for(int i=1;i<=n;i++) 16 { 17 if(i-k[i]>0) 18 { 19 cg[i][i-k[i]]=1; 20 } 21 if(i+k[i]<=n) 22 { 23 cg[i][i+k[i]]=1; 24 } 25 } 26 step[a]=0; 27 q[1]=a; 28 if(a==b) 29 { 30 cout<<0<<endl; 31 return 0; 32 } 33 do 34 { 35 for(int i=1;i<=n;i++) 36 { 37 if(cg[q[head]][i]==1) 38 { 39 if(book[i]==0) 40 { 41 book[i]=1; 42 tail++; 43 q[tail]=i; 44 step[i]=step[q[head]]+1; 45 if(q[tail]==b) 46 { 47 cout<<step[b]; 48 return 0; 49 } 50 } 51 } 52 } 53 head++; 54 }while(head<=tail); 55 cout<<-1<<endl; 56 return 0; 57 }