欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 文旅 > 八卦 > 算法题(112):catch the cow

算法题(112):catch the cow

2025/4/2 1:33:34 来源:https://blog.csdn.net/2301_79954395/article/details/146773556  浏览:    关键词:算法题(112):catch the cow

审题:

本题需要我们找出每一组数据中,fj找到牛所需要的最短步数,并将其打印出来

时间复杂度:

bfs的时间复杂度是O(N),而本题的搜索次数最多为1e5,所以时间复杂度是允许的

思路:

方法一:bfs+记忆化搜索

由于本题普通的贪心策略是不行的,所以我们就不考虑贪心,而是暴力搜索所有情况,不过在搜索过程中,我们如果遇到了完全相同的数据就需要查看备忘录,以减少搜索次数

解题:

(1)初始化

#include<iostream>
#include<queue>
using namespace std;
const int N = 1e5+10;
bool f[N];//备忘录
int t,x, y;

(2)main函数

int main()
{cin >> t;while (t--)//多组数据{cin >> x >> y;bfs();}return  0;
}

bfs的作用就是打印出当前组的数据最短步数

(3)bfs+记忆化搜索

void bfs()
{int distance = 1;queue<int> q;for (int i = 0; i < N; i++) f[i] = false; // 每次新的测试用例初始化访问数组q.push(x);f[x] = true;while (!q.empty()){int size = q.size();for (int j = 0; j < size; j++)//当前批次搜索{int fj = q.front();q.pop();int d[3] = { fj + 1,fj - 1,2 * fj };//方向数组for (auto& e : d){if (e == y)//找到牛了{cout << distance << endl;					return;}else if ((fj + e) > 0 && e <= 1e5 && f[e] != true)//对已经进入过队列的数据不再入队{q.push(e);f[e] = true;//访问记录}}}distance++;}
}

注意:

1.一旦遇到了值等于y,那么此时的distance就是最短距离:因为我们是一步步进行遍历的,所以最先搜索到y的就是最短距离

2.备忘录需要重新初始化:由于备忘录是全局变量,且我们有多组数据需要判断,所以要重新初始化防止上一组的数据残留影响当前组的判断

3.方向数组的建立:最关键的是对2*x的理解,他是动态的这个x表示的就是当前位置的值,而不是一开始录入的最开始的位置的值x

P1588 [USACO07OPEN] Catch That Cow S - 洛谷

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词