zoukankan      html  css  js  c++  java
  • HDU1548 A strange lift BFS

    一道基础广搜题

    但是我全给忘完了,

    重新梳理一遍

    记得标记,

    记得开结构体,

    记得标记的数组清空啊

    题意

    给出n、a、b,表示总共1-n层楼,求出从a到b层的最少步数

    有一个电梯,电梯只能上或下,接下去给出n个数,表示电梯如果到达这一层i的话可以向上或者向下走a[i]层,要是无法到达则输出-1

    思路

    广搜的一点点变形,将四个方向改为两个,向上或者是向下

    注意

    book数组标记记得清空啊

    AC代码

    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<string.h>
    #include<vector>
    #include<cmath>
    #include<queue>
    #include<stdlib.h>
    typedef long long ll;
    using namespace std;
    
    struct node
    {
        int x;
        int ss;
    } p,q;
    
    int aa[220];
    int book[220];
    int a,b,n;
    
    void bfs()
    {
        memset(book,0,sizeof(book));
        queue<node>Q;
        p.x=a;
        p.ss=0;
        Q.push(p);
        book[a]=1;
        int ans=0;
        while(!Q.empty())
        {
            q=Q.front();
            Q.pop();
            if(q.x==b)
            {
                printf("%d\n",q.ss);
                return;
            }
            for(int i=0; i<=1; i++)
            {
                p=q;
                if(i==0)
                    p.x+=aa[p.x];
                else
                    p.x-=aa[p.x];
                if(p.x>=1&&p.x<=n&&book[p.x]==0)
                {
                    p.ss=q.ss+1;
                    book[p.x]=1;
                    Q.push(p);
                }
            }
        }
        printf("-1\n");
        return;
    }
    
    int main()
    {
        while(~scanf("%d",&n))
        {
            if(n==0)
                break;
            scanf("%d %d",&a,&b);
            for(int i=1; i<=n; i++)
                scanf("%d",&aa[i]);
            bfs();
        }
        return 0;
    }
    
  • 相关阅读:
    POJ3666 Making the Grade[动态规划]
    vector内部的实现1
    win32概述
    stl概述
    C++概要简介
    类的常量成员
    模板
    c11标准
    异常处理
    pak文件的打包和解包
  • 原文地址:https://www.cnblogs.com/OFSHK/p/11462438.html
Copyright © 2011-2022 走看看