也可以用Dijkstra算法做,交了两次都超内存,发现没有做访问标记,第二次犯这种错误,唉。
题意:有一个奇怪的电梯,电梯里只有up 和 down 两个按钮,每层楼i都有一个ki值,如果在第I层按up则会上升到I+ki,按down则会降到I-ki,要保证移动后的楼层在1~N范围内,否则不会起作用。现在要求由A到B楼层,如果能够到达,找出按按钮次数最少的方法,并输出,否则输出-1
#include<iostream>
#include<queue>
#include<cstring>
using namespace std;
const int maxn =205;
int vis[maxn];
int main()
{
int N,A,B,a[maxn];
int step = -1,find = 0;
while(cin>>N&&N!=0)
{
cin>>A>>B;
for(int i=1;i<=N;i++)
cin>>a[i];
queue<int> q;
memset(vis,0,sizeof(vis));
step=-1,find=0;
q.push(A);
vis[A]=1;
while(!q.empty())
{
int n = q.size();
while(n--)
{
int c = q.front();
q.pop();
if(c==B)
{
find=1;
break;
}
if((c-a[c])>=1&&(c-a[c]<=N)&&!vis[c-a[c]])//设置访问标记,不要访问已经访问过的点
{
q.push(c-a[c]);
vis[c-a[c]]=1;
}
if((c+a[c]>=1)&&(c+a[c]<=N)&&!vis[c+a[c]])
{
q.push(c+a[c]);
vis[c+a[c]]=1;
}
}
step++;
if(find)break;
}
find ? cout<<step:cout<<-1;
cout<<endl;
}
}