hdu 1548 简单的bfs

来源:互联网 发布:mac怎么打包照片 编辑:程序博客网 时间:2024/05/12 16:30

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1548

自己写的第一个bfs的题目吐舌头

题意:电梯每层有一个不同的数字,例如第n层有个数字k,那么这一层只能上k层或下k层,但是不能低于一层或高于n层,给定起点与终点,要求出最少要按几次键
思路:一开始的想法是搜索,而且搜索也是可行的,不过既然这道题出在了最短路的专题里面,自然也要尝试下最短路的做法,要注意的是,这道题是单向边,我们只要让map里面的值全部为1就可以统计次数了
代码:
#include<algorithm>#include<cstdio>#include<cstring>#include<cmath>#include<cstdlib>#include<iostream>#include<queue>using namespace std;int n,s,e;int step[205];int vis[205];int a[205];int head,ne;int BFS(){    queue<int>q;    q.push(s);    vis[s]=1;    step[s]=0;    while(!q.empty())    {        head=q.front();        q.pop();        for(int i=0; i<2; i++)        {            if(i==0)                ne=head+a[head];            else                ne=head-a[head];            if(ne<1||ne>n)                continue;            if(!vis[ne])            {                q.push(ne);                vis[ne]=1;                step[ne]=step[head]+1;            }            if(ne==e)                return step[ne];        }    }    return -1;}int main(){    while(scanf("%d",&n)!=EOF)    {        memset(vis,0,sizeof(vis));        memset(step,0,sizeof(step));        if(n==0)            break;        scanf("%d%d",&s,&e);        for(int i=1; i<=n; i++)            scanf("%d",&a[i]);        printf("%d\n",BFS());    }}


0 0
原创粉丝点击