bzoj 1646: [Usaco2007 Open]Catch That Cow 抓住那只牛 bfs

来源:互联网 发布:1024控台控制帕灯编程 编辑:程序博客网 时间:2024/06/01 09:05

题意

有一个数轴,现在给出起点n和终点k,每次可以走到n+1或n-1或2*n,求最少走多少步可以走到k。
0<=n,k<=100000

分析

一开始还以为是玄学dp……
其实就是个广搜,上界为max(n,k*2),然后用一个数组f[i]表示走到点i最少需要多少步。

代码

#include<iostream>#include<cstdio>#include<cstdlib>#include<cstring>#include<algorithm>#include<queue>using namespace std;int f[400005],n,m;queue <int> q;void bfs(){    q.push(n);    f[n]=1;    while (!q.empty())    {        int u=q.front();        q.pop();        if (u+1<=max(n,m*2)&&!f[u+1])        {            f[u+1]=f[u]+1;            if (u+1==m) return;            q.push(u+1);        }        if (u-1>=0&&!f[u-1])        {            f[u-1]=f[u]+1;            if (u-1==m) return;            q.push(u-1);        }        if (u*2<=max(n,m*2)&&!f[u*2])        {            f[u*2]=f[u]+1;            if (u*2==m) return;            q.push(u*2);        }    }}int main(){    scanf("%d%d",&n,&m);    bfs();    printf("%d",f[m]-1);    return 0;}
0 0