裸题
需注意:
一、需要注意开vis数组记录;
二、关于状态的数组开多大。估计最坏的情况,开的略微大一点就可以
三、Pop().用t=q.front(),然后pop(),会很方便
四、因为没有每次清空队列而WA好多次,解决办法,1、自己写队列;2、每次都新建一个队列,可以将队列传递。比如在while循环里建队列,然后可以传递队列,在参数列表里queue &s即可,重新建队列效率明显比自己写队列再删除或者一个一个pop效率高
五、Impossible的情况
1 数据不合理注意很可能题中没有限制这一条所以一定自己判断
2 q已经empty还没有解决问题
加一句判断if(q.empty())printf("Impossi\n");
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define N 202
typedef struct{
int v;
int dis;
}node;
int main()
{
int ki[N],n,a,b,i,m,k;
node s[210],t;
bool vis[210];
while(scanf("%d",&n)!=EOF&&n!=0)
{
scanf("%d%d",&a,&b);
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++)
scanf("%d",&ki[i]);
queue<node>q;
if(a>n||b>n||a<0||b<0){printf("-1\n");continue;}
s[i=0].v=a;
s[0].dis=0;
q.push(s[0]);
vis[a]=1;
while(!q.empty())
{
t=q.front();
if(q.front().v==b){printf("%d\n",q.front().dis);break;}
m=q.front().v+ki[q.front().v];
k=q.front().v-ki[q.front().v];
q.pop();
if(m<=n&&!vis[m])
{
i++;
s[i].v=m;
s[i].dis=t.dis+1;
q.push(s[i]);
vis[m]=1;
}
if(k>0&&!vis[k])
{
i++;
s[i].v=k;
s[i].dis=t.dis+1;
q.push(s[i]);
vis[k]=1;
}
}
if(q.empty())printf("-1\n");
}
return 0;
}