原文链接: 使用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. 用状态空间方法求解修道士与野人问题

    目录 一.状态空间表示法回顾 1.问题状态空间的构成 2.用状态空间表示问题的步骤 二.使用状态空间法求解修道士与野人问题 1.问题描述 2.状态空间求解步骤 总结 一.状态空间表示法回顾 状态空间表 ...

  2. 修道士和野人问题:所有解、启发求解、简单界面

    一.作业任务 修道士和野人问题:设有三个修道士和3个野人来到河边,打算用一条船从河的左岸渡到河的右岸去.但该船每次只能装载两个人,在任何岸边野人的数目都不得超过修道士的人数,否则修道士就会被野人吃掉. ...

  3. 人工智能实践作业-修道士和野人过河问题

    人工智能实践作业-修道士和野人过河问题: 用编程语言编写和调试一个基于深度优先搜索法的解决"野人与传教士过河"问题的程序.目的是学会运用知识表示方法和搜索策略求解一些考验智力的简单 ...

  4. 1. A星算法解决修道士与野人问题

    A星算法解决修道士与野人问题 1. 运行环境 CPU:I5-10400 内存:16GB 系统:Win10 64位专业版,20H2 IDE:Vistual Studio 2019专业版 2. 问题描述 ...

  5. 修道士与野人问题——C++源代码,伪代码,详细分析

    前言:这一个经典的问题,可以把问题转换成数据结构中的 图 来解决.本博客节选自我去年7月份的数据结构报告 问题描述 假设有 n 个修道士和 n 个野人准备渡河,但只有一条能容纳 c 人的小船,为了防止 ...

  6. 修道士和野人java_修道士和野人问题

    休闲时刻看看神经网络方面的书,发现了修道士和野人的问题,不禁勾引起我写算法的欲望,曾经的三只大老虎三只小老虎过河问题.人狼羊白菜过河问题.汉诺塔.哈夫曼等等各种算法瞬间在脑海中约隐约现,修道士和野人问 ...

  7. 修道士和野人java_野人与修道士问题——详细分析与C++源代码

    前言:这一个经典的问题,可以把问题转换成数据结构中的 图 来解决.本博客节选自我去年7月份的数据结构报告 问题描述 假设有 n 个修道士和 n 个野人准备渡河,但只有一条能容纳 c 人的小船,为了防止 ...

  8. 2.修道士和野人问题

    2.修道士和野人问题:设有三个修道士和3个野人来到河边,打算用一条船从河的左岸渡到河的右岸去.但该船每次只能装载两个人,在任何岸边野人的数目都不得超过修道士的人数,否则修道士就会被野人吃掉.假设野人服 ...

  9. 修道士和野人java_修道士与野人问题(BFS广度搜索)

    #include "iostream.h" #include "string.h" //定义一个状态节点 typedef struct //存储各个状态 { i ...

最新文章

  1. PE文件和COFF文件格式分析——签名、COFF文件头和可选文件头1
  2. javascript es6 module 模块 的使用
  3. 三、hbase JavaAPI
  4. Myeclipse 10.5 下载地址
  5. Silverlight中枚举并加载客户端程序集
  6. 4300 字Python列表使用总结,用心!
  7. 永别了!2200元,老外眼中的2200元神机缺货数月后下架
  8. 微课|中学生可以这样学Python(例6.1):杨辉三角形
  9. Unity3D初级工程师面试题及知识点
  10. CS231n第一次作业_问题1
  11. 修改 mysql 的默认端口号_mysql的默认端口号修改方法
  12. Jboss4.2.3.GA运行后war包解压在哪
  13. 软件设计师考试都考什么内容
  14. 二维码和一维码生成器
  15. MFC Windows 程序设计[192]之六只眼八卦图按钮组(附源码)
  16. 过年不再被逼相亲——我用python给亲戚展示2022的相亲数据
  17. 国产操作系统和Linux
  18. 蒙泰RIP快捷键大全
  19. python 函数报错TypeError: object of type 'int' has no len()
  20. 基于XGBoost 的机器学习可解释性

热门文章

  1. 读Flink源码,肝进阿里云Flink组了。。
  2. 求大神赐教,如何实现echarts自定义legend的样式 如图下的这种
  3. 俞敏洪微博经典语录:年轻人该如何恋爱
  4. java spark一元(多元)线性回归
  5. 计算机连接苹果手机不能找到照片目录,iPhone与电脑连接后找不到照片怎么办?掌握这三个技巧,烦恼问题轻松解决!...
  6. 对类型“Func,”的引用声称该类型是在“mscorlib”中定义的,但未能找到
  7. 迭代逆推本金(c语言)
  8. 第四章 实验一 用类描述坦克
  9. Structured Streaming 编程模型
  10. clk_get函数介绍