8 搜索—Problem_1013&1014-A strange lift
题意
电梯每层有一个不同的数字,例如第n层有个数字k,那么这一层只能上k层或下k层,但是不能到达低于一层或高于n层的层数,给定起点与终点,要求出最少要按几次键才能到达目标层数。
解题思路
用BFS方法来做。对于当前所在楼层,有两种方案,上或下,且移动的楼层数为该层的指定数目,所以列出这两种情况,对每种情况在分别搜索,之道能到达目标楼层为止,在这个过程中,要对所经过的楼层做访问标记,同时进行相应计步,在到达目标楼层后相应返回总步数。
感想
BFS,运用搜索策略和相应模板(如队列进行罗列和展开),从而解决问题。
AC代码
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
#define SUM 210
int n,a,b;
int num[SUM],visit[SUM];
struct node{
int x,step;
};
bool judge(int x)
{
if( x<=0 || x>n ) return true;
return false;
}
int BFS()
{
queue<node>q;
node m,next;
int i;
m.x=a;
m.step=0;
visit[a]=1;
q.push(m);
while( !q.empty() )
{
m=q.front();
q.pop();
if(m.x==b) return m.step;
for(i=-1;i<=1;i+=2)
{
next = m;
next.x += i*num[next.x];
if( judge(next.x) || visit[next.x] ) continue;
visit[next.x]=1;
next.step++;
q.push(next);
}
}
return -1;
}
int main()
{
int i;
while(cin>>n,n)
{
cin>>a>>b;
for(i=1;i<=n;i++)
cin>>num[i];
memset(visit,0,sizeof(visit));
cout<<BFS()<<endl;
}
}