原题链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1548
题目大意:
N个数从A层开始到B层
N层依次能上升或者下降的层数
代码如下:
#include <iostream>
#include<cstdio>
#include<cstring>
#include<queue>
#include<utility>
using namespace std;
const int MAXN=200+5;
int f[MAXN];
bool flog[MAXN];
typedef pair<int,int> ii;//first为第几层second为第几步
int N,A,B;
int BFS()
{
ii pos;
pos.first=A;
pos.second=0;
queue<ii>q;
q.push(pos);
flog[A]=true;
while(!q.empty())
{
pos=q.front();
q.pop();
if(pos.first==B)
return pos.second;
if(pos.first-f[pos.first]>0&&!flog[pos.first-f[pos.first]])//下降
{
ii temp;
temp.first=pos.first-f[pos.first];
flog[pos.first-f[pos.first]]=true;
temp.second=pos.second+1;
q.push(temp);
}
if(pos.first+f[pos.first]<=B&&!flog[pos.first+f[pos.first]])//上升
{
ii temp;
temp.first=pos.first+f[pos.first];
flog[pos.first+f[pos.first]]=true;
temp.second=pos.second+1;
q.push(temp);
}
}
return -1;
}
int main()
{
while(scanf("%d",&N)!=EOF&&N)
{
memset(flog,0,sizeof(flog));
scanf("%d%d",&A,&B);
for(int i=1;i<=N;i++)
scanf("%d",&f[i]);
cout<<BFS()<<endl;
}
return 0;
}