基本思想:
第一次见到这种抽象形式的搜索问题,其实看相关参考问题豁然开朗,就是三维和二维遍历的一个变种,没有什么不同的;
自己当时首先卡在了以下几个点上:
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