bfs--最小步数--青蛙

链接:https://www.nowcoder.com/acm/contest/157/E
来源:牛客网
 

青蛙

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

有一只可爱的老青蛙,在路的另一端发现了一个黑的东西,想过去一探究竟。于是便开始踏上了旅途

一直这个小路上有很多的隧道,从隧道的a进入,会从b出来,但是隧道不可以反向走。

这只青蛙因为太老了,所以很懒,现在想请你帮帮慢,问他最少需要几步才可以到达对面。

将小径看作一条数轴,青蛙初始在0上,这只青蛙可以向前跳也可以向后跳,但每次只能跳一格,每跳一格记作一步,从隧道进到隧道出算做一步。

输入描述:

第一行两个数m,n;表示黑色物品在数轴m点上,数轴上总共有n个隧道
接下来n行,每行a,b两个数,表示从a进会从b出

10 <= m,n <= 233

0<a,b<=m

输出描述:

一个数ans表示最小步数

示例1

输入

复制

16 4
2 10
8 15
12 5
13 6

输出

复制

7

说明

 

0-->1-->2-->10-->9-->8-->15-->16

题意:解释一下自己WA的地方,隧道是一条捷径,你可以选择走也可以选择不走,不是有了隧道非得走。

第二个易错点,标记走过的点。

第三个易错点,就是开个vector保存隧道,以防出现隧道 1 2 隧道 1 3 隧道 1 4,用数组就没办法弄了。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int dx[2]={1,-1},n,m,ans,vv[2500];
vector<int>v[2500];
struct node
{
    int pos,step;
};
bool check(int x)
{
    if(x>=0&&x<=1000)
        return 1;
    return 0;
}
void bfs()
{
    queue<node>q;
    node tmp,now;
    tmp.pos=0;
    tmp.step=0;
    q.push(tmp);
    vv[tmp.pos]=1;
    while(!q.empty())
    {
        tmp=q.front();
        q.pop();
        if(tmp.pos==m)
        {
            ans=tmp.step;
            return;
        }
        for(int i=0;i<2;i++)
        {
            now.pos=tmp.pos+dx[i];
            now.step=tmp.step+1;
            if(check(now.pos)&&vv[now.pos]==0)
            {
                q.push(now);
                vv[now.pos]=1;
            }
        }
        for(int j=0;j<v[tmp.pos].size();j++)
        {
            now.pos=v[tmp.pos][j];
            now.step=tmp.step+1;
            if(check(now.pos)&&vv[now.pos]==0)
            {
                    q.push(now);
                    vv[now.pos]=1;
            }
        }
    }
    return;
}
int main()
{
    int a,b,i;
    scanf("%d%d",&m,&n);
    for(i=1;i<=n;i++)
    {
        scanf("%d%d",&a,&b);
       v[a].push_back(b);
    }
    memset(vv,0,sizeof(vv));
    bfs();
    printf("%d\n",ans);
}

猜你喜欢

转载自blog.csdn.net/qq_37891604/article/details/81583351