C++习题:野人与修道士过河问题

这篇博客探讨了C++在解决经典逻辑问题——野人与修道士过河问题上的应用。内容涉及如何避免犯规情况,如当船上有不同数量的好人与坏人时,如何确保安全过河。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 
河的左岸有3个野人和3个修道士以及一条小船,修道士们想用这条小船把所有的人都运到河的右岸,但又受到以下限制:
1、修道士和野人都会划船,但船一次只能载2人;
2、在任何岸边,野人数不能超过修道士数,否则修道士将会被野人吃掉。
假定野人愿意服从任何一种过河的安排,请规划出一种确保修道士安全的过河方案。

以下是犯规情形: - 例如,对面有1个坏,船上有1好1坏,则船到对面后1好2坏,犯规。

 
#include <stdio.h>

struct record
{
	int a,b,c,d;
};

record history[1000];
int    count = 0;

// 保存记录
void Push(int a, int b, int c, int d)
{
	record* r = &history[count];
	r->a = a;
	r->b = b;
	r->c = c;
	r->d = d;
	count ++;
}

// 追溯
void Pop()
{
	count --;
}

// 压入一个相对值,表示每次运人的数目
//(2,0)(0,2)(1,1)(1,0),(0,1)
//(-2,0)(0,-2)(-1,-1)(-1,0),(0,-1)
void Push(int x1, int x2)
{
	record* r = &history[count-1];
	int a = r->a;
	int b = r->b;
	int c = r->c;
	int d = r->d;
	Push(a-x1, b-x2, c+x1, d+x2);
}

// 当前状态是否曾经出现过,避免无限循环
bool IsDup
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿发你好

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值