链接: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);
}