搜索—Problem_1013&1014-A strange lift

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;
    }
}

你可能感兴趣的:(搜索—Problem_1013&1014-A strange lift)