使用dfs求解修道士和野人问题
原文链接: 使用dfs求解修道士和野人问题
上一篇: js Set 的使用
下一篇: VMware 挂载U盘
1、问题描述 :这是一个古典问题.假设有n个道士和n个野人准备渡河.但只有一条能容纳c人的小船,为了防止野人侵犯修道士,要求无论在何处,修道士的个数不得少于野人的个数(除非修道士个数为0).如果两种人都回会划船,设计一个算法,确定他们能否过河.若能,则给出小船来回次数最少的最佳方案.
使用三元组表示左岸的状态(x,y,z)分别表示左岸的道士人数,野人人数,和船在哪一边0左1右
根据船的位置,该三元组可以生成新的不同的三元组,注意,船上的人数和右岸的人数也需要满足相关要求,即道士人数为0或者道士数目大于野人 数目
递归搜索,由3 3 0搜索到 0 0 1 即可
let path = []
const N = 3
const C = 2// 用于存放答案的数组
const ANS = []function dfs(x, y, z) {// 如果该状态已经在path中,则返回,否则无限递归if (path.find((item) => item.toString() == [x, y, z].toString()))return falsepath.push([x, y, z])if (x == y && x == 0) {// 注意浅复制问题,这里需要拷贝ANS.push(Array.from(path))// 成功后一定要先pop再返回,否则会导致搜索空间减少,遗漏一些解path.pop()return true}for (let i = 0; i <= C; i++) {for (let j = 0; j <= C; j++) {// i,j是船上的人数if ((i + j) > 0 && (i + j) <= C && (i == 0 || i >= j)) {// nx,ny 是新的左岸人数,根据不同的船的位置计算let nx = x + (!!z ? i : -i)let ny = y + (!!z ? j : -j)if (nx >= 0 && ny >= 0 && nx <= N && ny <= N // 人数限制&& (nx == 0 || nx >= ny) //道士人数为0或者道士数目比野人多&& ((N - nx) == 0 || ((N - nx) >= (N - ny))) // 右岸的人数也需要满足道士数目为0,或比野人多) {// 满足条件则递归搜索dfs(nx, ny, !!z ? 0 : 1)}}}}path.pop()
}dfs(N, N, 0)// 输出满足要求的答案
for (let p of ANS) {console.log(p.join('->'))
}
3 3 2
3,3,0->3,1,1->3,2,0->3,0,1->3,1,0->1,1,1->2,2,0->0,2,1->0,3,0->0,1,1->0,2,0->0,0,1
3,3,0->3,1,1->3,2,0->3,0,1->3,1,0->1,1,1->2,2,0->0,2,1->0,3,0->0,1,1->1,1,0->0,0,1
3,3,0->2,2,1->3,2,0->3,0,1->3,1,0->1,1,1->2,2,0->0,2,1->0,3,0->0,1,1->0,2,0->0,0,1
3,3,0->2,2,1->3,2,0->3,0,1->3,1,0->1,1,1->2,2,0->0,2,1->0,3,0->0,1,1->1,1,0->0,0,1
参考
https://www.cnblogs.com/preacher/p/5997442.html
https://wenku.baidu.com/view/76c1dd19c281e53a5802ff90.html?rec_flag=default&sxts=1524014589681
使用dfs求解修道士和野人问题相关推荐
- 用状态空间方法求解修道士与野人问题
目录 一.状态空间表示法回顾 1.问题状态空间的构成 2.用状态空间表示问题的步骤 二.使用状态空间法求解修道士与野人问题 1.问题描述 2.状态空间求解步骤 总结 一.状态空间表示法回顾 状态空间表 ...
- 修道士和野人问题:所有解、启发求解、简单界面
一.作业任务 修道士和野人问题:设有三个修道士和3个野人来到河边,打算用一条船从河的左岸渡到河的右岸去.但该船每次只能装载两个人,在任何岸边野人的数目都不得超过修道士的人数,否则修道士就会被野人吃掉. ...
- 人工智能实践作业-修道士和野人过河问题
人工智能实践作业-修道士和野人过河问题: 用编程语言编写和调试一个基于深度优先搜索法的解决"野人与传教士过河"问题的程序.目的是学会运用知识表示方法和搜索策略求解一些考验智力的简单 ...
- 1. A星算法解决修道士与野人问题
A星算法解决修道士与野人问题 1. 运行环境 CPU:I5-10400 内存:16GB 系统:Win10 64位专业版,20H2 IDE:Vistual Studio 2019专业版 2. 问题描述 ...
- 修道士与野人问题——C++源代码,伪代码,详细分析
前言:这一个经典的问题,可以把问题转换成数据结构中的 图 来解决.本博客节选自我去年7月份的数据结构报告 问题描述 假设有 n 个修道士和 n 个野人准备渡河,但只有一条能容纳 c 人的小船,为了防止 ...
- 修道士和野人java_修道士和野人问题
休闲时刻看看神经网络方面的书,发现了修道士和野人的问题,不禁勾引起我写算法的欲望,曾经的三只大老虎三只小老虎过河问题.人狼羊白菜过河问题.汉诺塔.哈夫曼等等各种算法瞬间在脑海中约隐约现,修道士和野人问 ...
- 修道士和野人java_野人与修道士问题——详细分析与C++源代码
前言:这一个经典的问题,可以把问题转换成数据结构中的 图 来解决.本博客节选自我去年7月份的数据结构报告 问题描述 假设有 n 个修道士和 n 个野人准备渡河,但只有一条能容纳 c 人的小船,为了防止 ...
- 2.修道士和野人问题
2.修道士和野人问题:设有三个修道士和3个野人来到河边,打算用一条船从河的左岸渡到河的右岸去.但该船每次只能装载两个人,在任何岸边野人的数目都不得超过修道士的人数,否则修道士就会被野人吃掉.假设野人服 ...
- 修道士和野人java_修道士与野人问题(BFS广度搜索)
#include "iostream.h" #include "string.h" //定义一个状态节点 typedef struct //存储各个状态 { i ...
最新文章
- PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头1
- javascript es6 module 模块 的使用
- 三、hbase JavaAPI
- Myeclipse 10.5 下载地址
- Silverlight中枚举并加载客户端程序集
- 4300 字Python列表使用总结,用心!
- 永别了!2200元,老外眼中的2200元神机缺货数月后下架
- 微课|中学生可以这样学Python(例6.1):杨辉三角形
- Unity3D初级工程师面试题及知识点
- CS231n第一次作业_问题1
- 修改 mysql 的默认端口号_mysql的默认端口号修改方法
- Jboss4.2.3.GA运行后war包解压在哪
- 软件设计师考试都考什么内容
- 二维码和一维码生成器
- MFC Windows 程序设计[192]之六只眼八卦图按钮组(附源码)
- 过年不再被逼相亲——我用python给亲戚展示2022的相亲数据
- 国产操作系统和Linux
- 蒙泰RIP快捷键大全
- python 函数报错TypeError: object of type 'int' has no len()
- 基于XGBoost 的机器学习可解释性
热门文章
- 读Flink源码,肝进阿里云Flink组了。。
- 求大神赐教,如何实现echarts自定义legend的样式 如图下的这种
- 俞敏洪微博经典语录:年轻人该如何恋爱
- java spark一元(多元)线性回归
- 计算机连接苹果手机不能找到照片目录,iPhone与电脑连接后找不到照片怎么办?掌握这三个技巧,烦恼问题轻松解决!...
- 对类型“Func,”的引用声称该类型是在“mscorlib”中定义的,但未能找到
- 迭代逆推本金(c语言)
- 第四章 实验一 用类描述坦克
- Structured Streaming 编程模型
- clk_get函数介绍