搜索—Problem_1013&1014-A strange lift

来源:互联网 发布:软件如何防卸载 编辑:程序博客网 时间:2024/06/06 19:44

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 210int 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;    }}
0 0
原创粉丝点击