(算法)跳格子

题目:

有1,2,3,......无穷个格子,你从1号格子出发,每次1/2概率向前跳一格,1/2概率向前跳两格,走到格子编号为4的倍数时结束,结束时期望走的步数为____。

思路:

1、MonteCarlo模拟实验

参考代码

2、有限状态机的概率转移思想

跳一格跳两格都算一步;
dp(i,j)表示从格子i到格子j的期望步数:
dp(1,4)=1+0.5*dp(2,4)+0.5*dp(3,4);
dp(2,4)=1+0.5*dp(3,4)+0.5*dp(4,4);
dp(3,4)=1+0.5*dp(4,4)+0.5*dp(1,4);
dp(4,4)=0;
求解上述方程得到dp(1,4)=18/5;

代码:

#include<iostream>
#include<stdlib.h>
#include<time.h>
#include<string.h>

using namespace std;

bool rndJump(double p){
	double prob=rand()/(double)RAND_MAX;
	if(prob<=p)
		return true;
	else
		return false;
}

// MonteCarlo Simulation
double ExpectedSteps(){
	const int MAX_TRY=100000000;
	double expected=0;
	int total=0;
	int times=0;
	int steps=0;

	for(int i=0;i<MAX_TRY;i++){
		times=0;
		steps=1;
		while(steps%4!=0){
			if(rndJump(0.5))
				steps+=1;
			else
				steps+=2;
			times++;
		}
		total+=times;
	}

	expected=(double)total/MAX_TRY;

	return expected;
}


// DynamicProgramming-like
// f(1,4)=1+0.5*f(2,4)+0.5*f(3,4);
// f(2,4)=1+0.5*f(3,4)+0.5*f(4,4);
// f(3,4)=1+0.5*f(4,4)+0.5*f(1,4);
// f(4,4)=0;
double ExpectedSteps_DP(int n){
	double A[n],B[n];
	memset(A,0,n*sizeof(double));
	memset(B,0,n*sizeof(double));
	A[3]=0;
	B[3]=0;
	A[2]=1+0.5*A[3];
	B[2]=0.5;
	A[1]=1+0.5*A[2]+0.5*A[3];
	B[1]=0.5*B[2]+0.5*B[3];
	A[0]=1+0.5*A[1]+0.5*A[2];
	B[0]=0.5*B[1]+0.5*B[2];

	return (double)A[0]/(1-B[0]);
}


int main(){
	cout<< ExpectedSteps()<<endl;
	cout<< ExpectedSteps_DP(4)<<endl;
	return 0;
}

  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
抱歉,我是AI语言模型,无法提供代码,但我可以给你一些思路和提示。 A*算法是一种启发式搜索算法,可用于解决路径规划问题。在贪吃蛇游戏中,我们可以将蛇头作为起点,食物作为终点,然后使用A*算法寻找最短路径。 具体实现步骤如下: 1. 定义节点类,包含节点坐标、父节点、g值和h值等属性。 2. 定义open和closed列表,用于存储待搜索和已搜索的节点。 3. 将起点加入open列表,并设置g值为0,h值为起点到终点的估价函数值(比如曼哈顿距离)。 4. 进入循环,不断从open列表中选择f值最小的节点进行扩展。如果该节点是终点,则搜索结束。 5. 将该节点从open列表中删除,并加入closed列表。 6. 对该节点周围的格子进行遍历,计算每个格子的g值和h值,并加入open列表。 7. 如果该格子已经在closed列表中,或者是蛇身体,则跳过。如果该格子已经在open列表中,并且新的g值比原来的小,则更新该节点的g值和父节点。 8. 重复步骤4-7,直到找到终点或者open列表为空。 9. 如果找到了终点,则从终点开始回溯,得到最短路径。将路径上的第一个节点作为下一步的移动方向即可。 以上是一个大体的思路,具体实现时还需要考虑一些细节问题,比如如何判断蛇身体、如何遍历周围的格子、如何计算估价函数等等。 希望这些提示能对你有所帮助。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值