搜索—Problem_1013&1014-A strange lift

15 篇文章 0 订阅
15 篇文章 0 订阅

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;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值