题目描述
呵呵,有一天我做了一个梦,梦见了一种很奇怪的电梯。大楼的每一层楼都可以停电梯,而且第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 ===============================================================================================================================================这道题是在学校的acm赛制的月考上做的,然后因为我(du)是(cai)队(zhuan)长(zhen),所以我们队就叫Poppin‘Party。(popipa pipopa popipapapipopa!)然后因为我小(tai)小(guo)失(zhi)误(zhang),所以把vis和map定义为局部变量还没有memset,这道送分题上罚了不少时,没能成功rk1。QAQ
话不多说上代码(看了别人stl的觉得还是模拟好写w
#include <iostream> #include <cstdio> using namespace std; int n,a,b,k,head,tail,q[210],ste[210]; bool vis[210],map[210][210]; int main(){ cin>>n>>a>>b; for(int i=1;i<=n;i++){ cin>>k; if(i+k<=n) map[i][i+k]=1; if(i-k>0) map[i][i-k]=1; } if(a==b) {cout<<0<<endl;return 0;} head=0,tail=1; vis[a]=1; q[1]=a; ste[1]=0; while(head<=tail){ head++; for(int i=1;i<=n;i++){ if(vis[i]) continue; if(map[q[head]][i]==0) continue; tail++; vis[i]=1; q[tail]=i; ste[tail]=ste[head]+1; if(q[tail]==b) {cout<<ste[tail]<<endl; return 0;} } }cout<<-1<<endl; }
时间: 2024-11-04 22:52:33