算法练习(21):Frog Jump

题意:给出石头的位置,然后青蛙每一跳的距离a和上一跳距离k满足(k==a||k==a-1||k==a+1),第一个石头是位置0,第一跳只能距离为1.

分析与思路:这个题目用遍历搜索所有的路线是肯定可以做的,但是简单的遍历会超时,我用的方法是深度优先遍历同时排除掉不可能的情况。我用一个数据结构step来保存当前位置以及跳到这里的上一跳距离,我用一个优先队列(位置靠后的优先)保存所有出现过的step,同时要排除一些不可能情况,我排除的不可能情况在注释中已表明。

代码:

class step {//每一步的有关数据
public:
	int nowStone = 0;
	int lastdis = 0;
	step(int a, int b) {
		lastdis = b;
		nowStone = a;
	}
};
struct cmp {//优先队列的比较函数
	bool operator()(const step a, const step b) {
		return a.nowStone < b.nowStone;
	}
};
const int MAXSTEP = pow(2, 31) / 1000;
/*最长步距,最多1100个数据,最大值是pow(2, 31),所以满足条件的情况不可能有一步会超过这个值,
因为必须从一开始的1慢慢增到pow(2, 31),最少的步长要为pow(2, 31) / 1100,所以不妨放到除以1000,*/
class Solution {
public:
	bool canCross(vector<int>& stones) {
		if (stones.size() == 2) {//特殊情况
			if (stones[0] == 0 && stones[1] == 1) return true;
			else return false;
		}
		priority_queue<step,vector<step>,cmp> steps;
		steps.push(step(1, 1));//初始化
		int maxdis = 1;//记录在队列中出现过的满足条件的最长步距
		while (!steps.empty()) {
			step nowsteps = steps.top();
			steps.pop();
			int count = 3;//每一步的下一步最多有三种满足条件的情况
			for (int i = nowsteps.nowStone+1; i < stones.size(); i++) {
				if (stones[i] - stones[nowsteps.nowStone] > MAXSTEP) return false;//防止出现极端值
				if (stones[i] - stones[nowsteps.nowStone] > nowsteps.lastdis + 1) break;
				//出现了超过这个值以后的情况都不用考虑能作为当前步的下一步
				if (stones[i] - stones[nowsteps.nowStone] > maxdis + 1) return false;
				//出现了超过队列中出现的最长步距则说明不可能还能延续下去,可以终止了
				if (stones[i]-stones[nowsteps.nowStone] == nowsteps.lastdis
					|| stones[i]-stones[nowsteps.nowStone] == nowsteps.lastdis + 1
					|| stones[i]-stones[nowsteps.nowStone] == nowsteps.lastdis - 1) {
					count--;
					if (stones[i] - stones[nowsteps.nowStone] > maxdis) maxdis = stones[i] - stones[nowsteps.nowStone];//更新
					steps.push(step(i,stones[i]-stones[nowsteps.nowStone]));
					if (i == stones.size()-1) return true;//找到目标
					if (count == 0) break;
				}
			}
		}
		return false;
	}
};


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Random Frog算法是一种基于群体智能的优化算法,其灵感来源于青蛙在自然环境中的行为模式。在自然界中,青蛙通常会跳到不同的高度,并选择跳得更高的机会,以便更好地寻找食物和避免危险。Random Frog算法借鉴了这种行为模式,通过将搜索空间划分为许多不同的区域,并在每个区域内随机选择一个青蛙进行搜索。 Random Frog算法的基本步骤如下: 1. 初始化一群青蛙,每个青蛙被随机分配到不同的搜索空间区域。 2. 对于每个青蛙,根据一定的适应度函数评估其当前位置的优劣。 3. 对于每个青蛙,它可以选择跳到一个随机位置,或者跳到一个特定的跳跃距离内的新区域。这个跳跃距离通常是一个随机数,但可以根据需要进行调整。 4. 对于选择跳跃距离的青蛙,它会在新的区域内随机选择一个位置,并更新该位置。 5. 重复步骤2-4,直到满足某个终止条件,如达到最大迭代次数或找到满足要求的解。 Random Frog算法的特点是它具有全局和局部搜索的能力。通过随机跳跃,算法能够探索搜索空间的全局,同时每个青蛙也会根据适应度函数进行局部搜索,选择跳到一个更好的位置。这种算法适用于解决各种优化问题,如函数优化、机器学习、遗传算法的改进等。 此外,Random Frog算法还具有一些优点,如简单易实现、鲁棒性强、易于与其他算法结合等。同时,它也具有一定的缺点,如搜索效率可能受到搜索空间和跳跃距离的影响,需要适当的参数调整以获得最佳性能。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值