#include<iostream>
#include<algorithm>
#include<cstdio>
#include<string>
#include<vector>
#include<string.h>
#include<map>
#include<cmath>
#include<queue>
#define ll long long
#define INF 0x7fffffff
#define MAX 0x3f3f3f3f
#define maxn 100005
#define ull unsigned long long
using namespace std;
int st,en,n,f[205];
bool v[205];
struct node
{
int floor,step;//第几step时在第几层
};
int bfs()
{
queue<node> q;
node a,b;
a.floor=st;a.step=0;//a是初始状态
v[st]=1;
q.push(a);//初始状态入队
while(!q.empty())
{
a=q.front();//a用于提取队首
q.pop();
if(a.floor==en)//找到答案
return a.step;
b=a;//b是中间变量
b.floor-=f[b.floor];
if(b.floor<1||b.floor>n||v[b.floor]);
else{
v[b.floor]=1;
b.step++;
q.push(b);
}
b=a;
b.floor+=f[b.floor];
if(b.floor<1||b.floor>n||v[b.floor]);
else{
v[b.floor]=1;
b.step++;
q.push(b);
}
}
return -1;
}
int main()
{
int i;
while(~scanf("%d",&n)&&n)
{
scanf("%d%d",&st,&en);
memset(v,0,sizeof(v));
for(i=1;i<=n;i++)
scanf("%d",&f[i]);
printf("%d\n",bfs());
}
return 0;
}
用BFS广搜
用广搜就会想到队列
include
queque<这个里面可以是很多类型也可以是结构体>q
q.front(x)访问数组的第一个元素
q.back(x)访问数组的最后一个元素
q.size()
这里转载一下比较简洁的写法:
for(i = -1; i <= 1; i+=2)
{
next = a;
next.x += i * ss[next.x];
if(check(next.x)||vis[next.x])
{
continue;
}
vis[next.x] = 1;
next.step++;
Q.push(next);
}
————————————————
原文链接:https://blog.csdn.net/a49681109/article/details/45825751