Sheep Eat Wolves

题目链接

题意:

左岸有x只羊,y只狼,船每次可以载p只动物,狼比羊数量超过q只就会出事(即x+q<y),农夫一开始在左岸,有农夫的地方不会出事,问不出事的前提下把所有羊运到右岸的最少渡河次数(单程,去和回来都要算)

思路:

一开始以为是思维题,但是看到第三个样例发现太难想了,而且数据很小,所以考虑爆搜。设置一个状态 S [ x , y , f ] S[x,y,f] S[x,y,f]表示左岸有x只羊,y只狼,农夫在哪(0表示在左岸,1表示右岸),存储到达这个状态的渡河次数,这样就把一个局面用三个状态描述下来了。考虑用bfs,转移的话就是从当前状态枚举船上羊的个数i和狼的个数j,剩下p-i-j的位置留空。还可以设置一个vis数组来防止重复走过一些状态,时间复杂度最坏是O(n^4),能过。

code:

#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
const int maxn=105;

int x,y,p,q;//羊 狼 运输数量 差值
struct S{
	int x,y,f;
	int tm;
};
queue<S> s;
bool vis[maxn][maxn][2];

void pt(S x){
	printf("%d %d %s %d\n",x.x,x.y,(x.f)?"右岸":"左岸",x.tm);
}

int main(){
	cin>>x>>y>>p>>q;
	s.push((S){x,y,0,0});
	vis[x][y][0]=true;
	while(!s.empty() && s.front().x!=0){
		S now=s.front();
//		pt(now);
		s.pop();
		for(int i=0;i<=p;i++)
			for(int j=0;j<=p-i;j++){//船上i只羊j只狼p-i-j留空 
				if(!now.f){//左岸->右岸 
					if(i>now.x || j>now.y)continue;//船上不符合条件 
					if(now.x-i!=0 && now.x-i+q<now.y-j)continue;//左岸不符合条件
					if(vis[now.x-i][now.y-j][1])continue;
					s.push((S){now.x-i,now.y-j,1,now.tm+1}); 
					vis[now.x-i][now.y-j][1]=true;
				}
				else {//右岸->左岸 
					if(i>x-now.x || j>y-now.y)continue;//船上不符合条件 
					if(x-now.x-i!=0 && x-now.x-i+q<y-now.y-j)continue;//右岸不符合条件
					if(vis[now.x+i][now.y+j][0])continue;
					s.push((S){now.x+i,now.y+j,0,now.tm+1}); 
					vis[now.x+i][now.y+j][0]=true;
				}
			}
	}
	if(!s.empty())cout<<s.front().tm;
	else cout<<-1;
	return 0;
}
/*
4 4 3 1
3 5 2 0
2 5 1 1

*/
  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
### 回答1: Reeds-Shepp曲线是一种具有最小转弯半径的最优路径,用于在平面上连接两个点。它是由Steven M. LaValle在1994年提出的,以Joseph L. Reeds和Laurent E. G. Shepp的名字命名。Reeds-Shepp曲线的特点是可以实现任何转弯角度,并且总路径长度最短。Reeds-Shepp曲线有五种基本类型,分别是R, L, S, RS和LS曲线,其中R表示右转,L表示左转,S表示直行,RS表示右转后直行,LS表示左转后直行。 在MATLAB中,可以使用reedsSheppConnection函数计算两个点之间的Reeds-Shepp曲线。以下是一个示例代码: ``` start = [0 0 0]; goal = [10 10 pi/2]; r = 1; rsPath = reedsSheppConnection(start,goal,r); ``` 其中start和goal是起始点和目标点的坐标和方向,r是机器人的最小转弯半径。reedsSheppConnection函数返回一条Reeds-Shepp曲线,可以使用plot函数将其可视化。 ``` plot(rsPath(:,1), rsPath(:,2), 'k'); axis equal; ``` ### 回答2: reeds-sheep曲线是一种描述生态系统中物种之间相互作用的数学模型。该模型是由英国生态学家C.S.汤普森于1924年提出的,用来研究捕食者和其猎物之间的关系。 reeds-sheep曲线的基本原理是,当猎物数量较小时,捕食者的数量也会随之减少。反之,当猎物数量增加时,捕食者的数量也会相应增加。这种关系被看作是一种自然的平衡状态。当猎物数量更多时,捕食者的食物供应充足,可以容纳更多的个体,导致捕食者密度增加。然而,这种增长过程是有限的,因为捕食者食物来源的增加会导致其繁殖率下降,个体间的竞争也会增加。 随着捕食者数量的增加,猎物数量逐渐减少。当捕食者数量达到一定水平时,猎物数量下降得足够多,捕食者的食物供应开始减少。由于食物不足,捕食者个体之间的竞争加剧,导致捕食者数量下降。最终,猎物数量再次增加,并开始一个新的周期。 reeds-sheep曲线反映了捕食者和猎物之间的动态平衡。它强调了生态系统中物种相互作用的复杂性和多样性。这种关系在自然界中广泛存在,不仅仅适用于羊和食草动物,还适用于其他动物群体和它们的食物链。 通过研究reeds-sheep曲线,我们可以更好地了解捕食者和猎物之间的相互作用以及生态系统的平衡调节机制。这些知识有助于我们更好地保护和管理生态系统,促进生物多样性的维持和可持续发展。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值