Java乘船_妖怪和和尚过河问题(javascript实现)

这篇博客是《算法的乐趣》读书笔记,通过JavaScript重新实现了一个算法,解决三个和尚和三个妖怪如何利用一艘小船过河的问题,保证和尚不被妖怪吃掉。文章详细介绍了变量定义、检测乘船安排的可行性、船到岸后的操作以及状态搜索主函数等关键步骤。
摘要由CSDN通过智能技术生成

此为《算法的乐趣》读书笔记,我用javascript重新实现算法。

敝人拙见

此题作者实现得过于复杂,我将初始状态定义为:[3,3,0,0,true],释义:依次表示,此岸和尚数量、此岸妖怪数量、彼岸和尚数量、彼岸妖怪数量、船在此岸否。有了以上定义,完全可以将这个题目看成与上一章桶等分水那个题目是一样的问题,两岸是两个“桶",和尚和妖怪是"水","水"在两个”桶“中回来倒,最后全部倒到彼岸那个桶中。

问题描述

有三个和尚和三个妖怪要利用唯一的一条小船过河,这条小船一次只能载两个人,同时,无论是在河的两岸还是在船上,只要妖怪的数量大于和尚的数量,妖怪们就会将和尚吃掉。现在需要选择一种过河的安排,保证和尚和妖怪都能过河且和尚不能被妖怪吃掉。

变量定义

var states = [[3,3,0,0,true]]; //初值,顺序为:本地和尚、妖怪;对岸和尚、妖怪、船在此岸

var IsLocal = true; //是否在此岸,是为真,在对岸为假

检测乘船安排是否可行(倒水方法合理?)

function CanTakeDumpAction(curr,local,from,to){

//检测船上,和尚数量大于等于妖怪或者和尚为零且总数为1或2

if((from >= to || from === 0 && to > 0) && (from + to <= 2) && (from + to > 0))

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个用C语言实现的n个修道士和n个野人坐船过河问题的程序: ```c #include <stdio.h> #define MAX 10 int left_m, left_c, boat_m, boat_c, right_m, right_c; int num_m, num_c; void print_state() { printf("Left: %d %d, Boat: %d %d, Right: %d %d\n", left_m, left_c, boat_m, boat_c, right_m, right_c); } int valid() { if (left_m < 0 || left_c < 0 || right_m < 0 || right_c < 0) { return 0; } if (left_m > 0 && left_m < left_c) { return 0; } if (right_m > 0 && right_m < right_c) { return 0; } return 1; } void move(int m, int c) { boat_m -= m; boat_c -= c; right_m += m; right_c += c; } void back(int m, int c) { boat_m += m; boat_c += c; right_m -= m; right_c -= c; } void search() { if (boat_m > 2 || boat_c > 2) { return; } if (right_m == num_m && right_c == num_c) { print_state(); return; } if (valid()) { print_state(); move(2, 0); search(); back(2, 0); move(0, 2); search(); back(0, 2); move(1, 1); search(); back(1, 1); move(1, 0); search(); back(1, 0); move(0, 1); search(); back(0, 1); } } int main() { printf("Enter the number of missionaries and cannibals: "); scanf("%d", &num_m); num_c = num_m; left_m = num_m; left_c = num_c; boat_m = 0; boat_c = 0; right_m = 0; right_c = 0; search(); return 0; } ``` 该程序使用了递归的方法来搜索所有可能的移动方案,并在每次移动之后检查当前状态是否满足条件。如果满足条件,则输出当前状态并继续搜索下一个状态。如果不满足条件,则需要返回之前的状态并尝试其他移动。最终,程序将输出所有可以让所有人都安全过河的方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值