用bfs解决poj上的3278为什么一直显示超时?

这是我的代码,应该是可以算出正确答案的,但是提交后一直显示超时,我剪枝了很多地方可还是通过不了,真的很不理解!!
我用的是bfs,分支限界法,还用了queue

#include<iostream>
#include<cstring>
#include<queue>

using namespace std;

int N;    //农夫的位置,范围0~1000,000
int K;    //牛的位置,范围0~1000,000
int bestlen;    //最远走到的位置
bool yet[1000010];    //已走过的位置赋值为true,便于剪枝
int Count[1000010] = { 0 };    //记录每一步的步数
queue<int>open;    //open表,一层一层存储,死节点
queue<int>close;    //close表,扩展节点
int best = 0;    //存放最优解

void BFS() {
    while (true) {
        int num = close.front();    //num用于记录当前扩展结点的值
        int num_a;    //num_a用于记录当前扩展结点的子节点
        for (int i = 1; i <= 3; i++) {    //农夫有三种移动可能
            switch (i) {
            case 1:    //农夫移动方式为X-1
                num_a = num - 1;
                if (!yet[num_a] && num_a >= 0 && num_a < bestlen && Count[num_a] <= abs(N - K)) {    //剪枝
                    close.push(num_a);    //子节点满足条件则放在close表最后
                    Count[num_a] = Count[num] + 1;    //步数加1,即层数加1
                    yet[num_a] = true;    //记录已走过的位置,置为true
                    if (close.back() == K) {    //找到最优解
                        best = Count[close.back()];    //将最优解记录下来
                        return;    //找到最优解退出函数
                    }

                }
                break;
            case 2:    //农夫移动方式为X+1
                num_a = num + 1;
                if (!yet[num_a] && num_a <= 1000000 && num_a < bestlen && Count[num_a] <= abs(N - K)) {
                    close.push(num_a);
                    Count[num_a] = Count[num] + 1;    //步数加1
                    yet[num_a] = true;    //记录已走过的位置
                    if (close.back() == K) {    //找到最优解
                        best = Count[close.back()];
                                return ;
                    }

                }
                break;
            case 3:    //农夫移动方式为X*2
                num_a = num * 2;
                if (!yet[num_a] && num_a <= 1000000 && num_a < bestlen && Count[num_a] <= abs(N - K)) {
                    close.push(num_a);
                    Count[num_a] = Count[num] + 1;    //步数加1
                    yet[num_a] = true;    //记录已走过的位置        
                    if (close.back() == K) {    //找到最优解
                        best = Count[close.back()];
                                            return ;
                    }

                }
                break;
            }
        }
        open.push(close.front());
        close.pop();
    }

}

int main() {
    memset(yet, false, sizeof(open));    //将yet数组的元素都初始化为false
    cin >> N >> K;
    close.push(N);    //将农夫的位置放在close表中
    yet[N] = true;    //将农夫的位置赋值为true,表示此位置不可重复走
    bestlen = K + abs(N - K);    //初始化最远长度

    BFS();    //广度优先搜索
    cout << best << endl;    //输出最优解

    return 0;
}

#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
int n,m;

int dfs(int t)
{
    if(t<=n)
        if(n-t<t*2-n+1)
            return n-t;
        else
            return t*2-n+1;
    if(t%2==1)
        return min(min(dfs(t+1)+1,dfs(t-1)+1),t-n);
    else
        return min(dfs(t/2)+1,t-n);
}

int main()
{
    while(cin>>n>>m)
    {
        if(n>m)
        {
            cout<<n-m<<endl;
            continue;
        }
        int t=m;
        int ans=0;
        if(n==0)//这段很重要
        {
            n=1;
            ans=1;
        }
        ans+=dfs(t);
        cout<<ans<<endl;
    }
    return 0;
}

https://blog.csdn.net/LXYDSF/article/details/114181173

  • 这篇博客: 一篇文章完全弄懂广度优先搜索(BFS)中的 队列(Queue) 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 在讲广度优先搜索时,我们先来复习一下队列(Queue),这里不把队列作为介绍的重点,基本功扎实的小伙伴可以跳过这一部分。

    队列是一种数据结构,也就是存放、操作数据的方式,重点需要掌握的是他的逻辑——“先进先出”。跟我们生活中排队上车一样,先进入队列的,先刷卡上车,后进入队列的人只能等前面的人离开队列,才能向前移动。

    队列的主要操作

    1. 入队(push)
    2. 出队(pop)
    3. 判断队列是否为空(empty)
    4. 统计队列元素个数(size)
    5. 访问队首元素(front)

    在C++标准模板库中,我们已经有队列实现好了的模板。

    #include<queue> //queue头文件
    queue<T> q; //构建一个T类型的队列
    q.push(XX); //入队
    q.pop(); //出队
    q.front() //获得队首元素
    q.empty(); //判断队列是否为空,在pop之前需要检查一下

    队列的介绍到此结束,如果有点懵的话,建议先好好学习一下队列,再继续学习广度优先搜索,因为广度优先搜索可以使用队列实现。