狼追兔子问题C模拟解

说,一只兔子在O点处,它的洞穴在正北20m的B点处,一只狼位于兔子正东33米的A点处,模拟如下追逐问题:狼以一倍于兔子的速度紧盯兔子追击,问兔子到达洞口前是否会被狼逮住?

网上很多人说能被追上,包括类似的一题距离兔子100码,洞在60码处的。那么究竟能不能呢?

通过计算机模拟,不用解算微分方程,就可以找到答案。

计算机要模拟,基本上就是用第推算法,给出初始条件,按公式计算下一步,如此往复直到一定条件终止计算。

模拟追逐问题,就把时间切片来看,这一步是什么样下一步又是如何,这里把速度可以转换为步进距离来看。

假设平面坐标系上,兔子位于原点O,正北为y轴正向,狼从I象限追进。

#include <stdio.h>
#include <math.h>

double Td,Tx,Ty,Ld,Lx,Ly;

double dist()
{
	return sqrt((Tx-Lx)*(Tx-Lx)+(Ty-Ly)*(Ty-Ly));
}

//狼位置变化,指向兔子的线段上跑动Ld距离,相应ldx,ldy分量
double NextL()
{
	double dx=fabs(Tx-Lx);
	double dy=fabs(Ty-Ly);
	double k,dk;
	int usek=1;
	double ldx;
	double ldy;
	//
	if(dx > 0.00000000001 )
	{
		k=dy/dx;
	}else
	{
		usek=0;
		dk=dx/dy;
	}
	//
	if(usek==1)
	{
		ldx=sqrt((Ld*Ld)/(k*k+1));
		ldy=k*ldx;
	}else
	{
		ldy=sqrt((Ld*Ld)/(dk*dk+1));
		ldx=dk*ldy;
	}
	//仅限I象限非震荡追进
	Lx=Lx-ldx;
	Ly=Ly+ldy;
}

//兔子位置变化
double NextT()
{
	Tx=Tx;
	Ty=Ty+Td;
}

void loop()
{
//坐标建立,初始化
 Tx=0.0;
 Ty=0.0;
 Lx=33.0;
 Ly=0.0;
//兔子步进距离
 Td=0.1;
//狼步进距离
 Ld=Td*2.0;
	while( dist() >= Td )
	{
		NextL();
		NextT();
		printf("兔子:(%lf,%lf) 狼:(%lf,%lf)\n",Tx,Ty,Lx,Ly);
	}
	//
}

int main(int argc,char** argv)
{
	loop();
	return 0;
}

这里,NextT给出了兔子的位置第推公式,NextL给出了狼的位置第推公式,在循环时因为狼是根据兔子的位子来做下一步推算的所以要先于兔子位置变换来做移动(反过来的话也可,就是说狼还能稍稍预测兔子的动向,如果狼能预测判断兔子路径完全跑直线可追上兔子无疑,然而事实一般都是紧追不舍的多。)

运行结果

兔子:(0.000000,0.100000) 狼:(32.800000,0.000000)
兔子:(0.000000,0.200000) 狼:(32.600001,0.000610)
兔子:(0.000000,0.300000) 狼:(32.400005,0.001833)
兔子:(0.000000,0.400000) 狼:(32.200013,0.003673)
兔子:(0.000000,0.500000) 狼:(32.000028,0.006135)
兔子:(0.000000,0.600000) 狼:(31.800052,0.009221)
兔子:(0.000000,0.700000) 狼:(31.600087,0.012936)
兔子:(0.000000,0.800000) 狼:(31.400134,0.017284)
兔子:(0.000000,0.900000) 狼:(31.200196,0.022267)
兔子:(0.000000,1.000000) 狼:(31.000275,0.027892)
兔子:(0.000000,1.100000) 狼:(30.800373,0.034160)
兔子:(0.000000,1.200000) 狼:(30.600493,0.041077)
兔子:(0.000000,1.300000) 狼:(30.400636,0.048646)
兔子:(0.000000,1.400000) 狼:(30.200805,0.056872)
兔子:(0.000000,1.500000) 狼:(30.001003,0.065757)
兔子:(0.000000,1.600000) 狼:(29.801231,0.075308)
兔子:(0.000000,1.700000) 狼:(29.601492,0.085527)

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值