首页 > 其他 > 详细

Poj Cath That Cow 需要二刷 *BFS遍历问题,自己没见过

时间:2020-03-08 18:51:29      阅读:81      评论:0      收藏:0      [点我收藏+]

基本思想:

第一次见到这种抽象形式的搜索问题,其实看相关参考问题豁然开朗,就是三维和二维遍历的一个变种,没有什么不同的;

 

自己当时首先卡在了以下几个点上:

1.用BFS还是DFS?

显然用不了DFS,其一代价太大,不确定因素太多;其二不能保证边界到达时是最优的;

 

2.怎么保证边界最优?

答案是设定一个参考标志time;

对于每一次while循环,就是时间t+1,所以先找到的第一个复合边界要求的点,时间必定最小;

 

关键点:

无;

 

#include<iostream>
#include<string>
#include<vector>
#include<queue>
using namespace std;

const int maxn = 100001;

bool vis[maxn];


struct node {
    int time;
    int val;
    node(int v, int t) {
        time = t;
        val = v;
    }
};

int bfs(int n, int k) {
    node no(n, 0);
    queue<node>q;
    q.push(no);
    while (!q.empty()) {
        node now = q.front();
        q.pop();
        if (now.val == k)
            return now.time;
        for (int i = 0; i < 3; i++) {
            //三种状态;
            node cur(now.val, now.time + 1);
            if (i == 0) {
                //*2情况;
                cur.val *= 2;
            }
            else if (i == 1) {
                //加1情况;
                cur.val++;
            }
            else {
                cur.val--;
            }
            if (cur.val >= 0 && cur.val <= maxn && !vis[cur.val]) {
                q.push(cur);
                vis[cur.val] = true;
            }
        }
    }
}

int main() {
    int n, k;
    cin >> n >> k;
    fill(vis, vis + maxn, false);
    cout << bfs(n, k) << endl;
    return 0;
}

 

Poj Cath That Cow 需要二刷 *BFS遍历问题,自己没见过

原文:https://www.cnblogs.com/songlinxuan/p/12443900.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!