#include<iostream>
#include<cstring>
using namespace std;
int queue[201],k[201],cnt[201],vis[201];
int main()
{
freopen("D:\\in.txt","r",stdin); //输入重定向,输入数据将从D盘根目录下的in.txt文件中读取
freopen("D:\\out.txt","w",stdout); //输出重定向,输出数据将保存在D盘根目录下的out.txt文件中
int n,start,end,i,head=1,tail=2,k1,k2,s=0;
cin>>n>>start>>end;
for(i=1;i<=n;i++)
cin>>k[i];
queue[1]=start;
cnt[start]=0;
vis[start]=1;
while(head<tail)
{
s=cnt[queue[head]];
k1=queue[head]+k[queue[head]];
k2=queue[head]-k[queue[head]];
if(queue[head]==end)
{
cout<<cnt[queue[head]]<<endl;
return 0;
}
if(k1>=1&&k1<=n&&vis[k1]==0)
{
cnt[k1]=s+1; //这里实际是棵二叉树,继承父亲的计数,根节点为0,生出孩子再计数
queue[tail]=k1;
tail++;
cout<<cnt[k1]<<endl;
vis[k1]=1;
}
if(k2>=1&&k2<=n&&vis[k2]==0)
{
cnt[k2]=s+1;
queue[tail]=k2;
tail++;
vis[k2]=1;//验试的标记需要跟入队同时进行,前面我放在了头指针上同时进行,这样的问题可能会产生已经入队但是未作验视标记的节点继续进入判断并且他的孩子入队。
//逻辑严谨非常重要
cout<<cnt[k2]<<endl;
}
head++;
}
cout<<"-1"<<endl;
return 0;
}
电梯问题的队列实现
最新推荐文章于 2024-08-01 09:03:54 发布