【传教士和食人者问题】
在河的左岸有3个传教士、1条船和3个食人者,传教士们想用这条船将所有的成员运到河的右岸,但是受到以下条件的限制:
(1)船每次最多只能装2个乘客(传教士和食人者都会划船);
(2)在任何岸边,如果食人者数目超过传教士则传教士将被食人者吃掉。
(3)假定食人者会服从任何一种过河安排。
只输出一个解,但是输出一个解后会继续运行,如果想要得到全部解,需要稍加修改输出部分,本代码使用迭代法,深度优先策略。

M,N,K=3,3,2
list1=[(3,3,1)]
def LeftToRight(lm,lc,lb):for i in range(0,lm+1):for j in range(0,lc+1):if i+j<=K and (lm-i>=lc-j or lm-i==0) and (M-lm+i>=N-lc+j or M-lm+i==0)and (lm-i,lc-j,0) not in list1 and i+j>0 and (i==0 or i>0 and j<=i):#判断是否满足过河条件print("有", i, "个人", j, "个野人从左岸到右岸")list1.append((lm-i,lc-j,0))print("左岸状态:",list1[len(list1)-1])RightToLeft(M-lm+i,N-lc+j,0)if i==lm+1 and (0,0,0) not in list1:print("无解决方案")
def RightToLeft(rm,rc,lb):if rm==M and rc==N:print(list1)else:for i in range(0,rm+1):for j in range(0,rc+1):if i+j<= K and (rm-i>=rc-j or rm-i==0)and (M-rm + i>=N-rc+j or M-rm+i==0)and (M-rm+i,M-rc+j,1) not in list1 and i+j>0 and (i==0 or i>0 and j<=i):print("有",i,"个人",j,"个野人从右岸到左岸")list1.append((M-rm + i, M-rc+j, 1))print("左岸状态:", list1[len(list1) - 1])LeftToRight(M-rm+i,N-rc+j,1)print("从列表中删除状态:",list1[len(list1)-1],"恢复到上一个状态:",list1[len(list1)-2])list1.pop()#删除没有接下来没有解决方案的上一条方案
def main():LeftToRight(M,N,1)
if __name__=="__main__":main()

结果
*有 0 个人 1 个野人从左岸到右岸
左岸状态: (3, 2, 0)
从列表中删除状态: (3, 2, 0) 恢复到上一个状态: (3, 3, 1)
有 0 个人 2 个野人从左岸到右岸
左岸状态: (3, 1, 0)
有 0 个人 1 个野人从右岸到左岸
左岸状态: (3, 2, 1)
有 0 个人 2 个野人从左岸到右岸
左岸状态: (3, 0, 0)
有 0 个人 1 个野人从右岸到左岸
左岸状态: (3, 1, 1)
有 2 个人 0 个野人从左岸到右岸
左岸状态: (1, 1, 0)
有 1 个人 1 个野人从右岸到左岸
左岸状态: (2, 2, 1)
有 2 个人 0 个野人从左岸到右岸
左岸状态: (0, 2, 0)
有 0 个人 1 个野人从右岸到左岸
左岸状态: (0, 3, 1)
有 0 个人 2 个野人从左岸到右岸
左岸状态: (0, 1, 0)
有 0 个人 1 个野人从右岸到左岸
左岸状态: (0, 2, 1)
有 0 个人 2 个野人从左岸到右岸
左岸状态: (0, 0, 0)
[(3, 3, 1), (3, 1, 0), (3, 2, 1), (3, 0, 0), (3, 1, 1), (1, 1, 0), (2, 2, 1), (0, 2, 0), (0, 3, 1), (0, 1, 0), (0, 2, 1), (0, 0, 0)]
有 1 个人 0 个野人从右岸到左岸
左岸状态: (1, 1, 1)
从列表中删除状态: (1, 1, 1) 恢复到上一个状态: (0, 0, 0)
从列表中删除状态: (0, 0, 0) 恢复到上一个状态: (0, 2, 1)
从列表中删除状态: (0, 2, 1) 恢复到上一个状态: (0, 1, 0)
从列表中删除状态: (0, 1, 0) 恢复到上一个状态: (0, 3, 1)
有 1 个人 0 个野人从左岸到右岸
左岸状态: (2, 2, 0)
从列表中删除状态: (2, 2, 0) 恢复到上一个状态: (0, 3, 1)
从列表中删除状态: (0, 3, 1) 恢复到上一个状态: (0, 2, 0)
有 1 个人 1 个野人从左岸到右岸
左岸状态: (2, 2, 0)
从列表中删除状态: (2, 2, 0) 恢复到上一个状态: (0, 2, 0)
*

人工智能-传教士和食人者问题 python相关推荐

  1. 编程解决 传教士和食人者问题

    很简单的搜索,但是其中的条件还是太多,卡了好久 ans : 解法个数 m1[],m2[] 中记录船只上的传教士和食人者方案,负数表示船由西向东航行,整数相反.例如m1[i] = -1,m2[i] = ...

  2. 用空间状态法求解传教士和食人者问题

    空间状态法求解传教士和食人者问题 问题描述: 问题解决: (1)确定状态变量及确定值域: 设左岸传教士.野人.船的数目分别为:m,c,b:则右岸相应的数目为:3-m,3-c,1-b; (2)确定状态组 ...

  3. 传教士与食人者问题python

    问题描述 在河的左岸有3个传教士.1条船和3个食人者,传教士们想用这条船将所有的成员运到河的右岸,但是受到以下条件的限制: (1)船每次最多只能装2个乘客(传教士和食人者都会划船). (2)在任何岸边 ...

  4. 人工智能导论实验二 食人族传教士过河+黑白棋 prolog+Python

    实验目的及要求: 本项目要求能够理解人工智能的基本原理,理解状态空间的概念.原理和方法,掌握用状态空间表示问题的步骤,掌握搜索方法的基本原理,并能够实际问题给出具体的实现. 实验内容: 状态.状态空间 ...

  5. 哪些人适合参加Python培训班?

    哪些人适合参加Python培训班?确实,不是所有人都适合参加Python培训班的,有一定基础的同学会选择自学,零基础的同学比较适合参加Python培训班,来看看下面的具体介绍. 哪些人适合参加Pyth ...

  6. 必备 | 人工智能和数据科学的七大 Python 库

    来源:新智元 本文约3100字,建议阅读10+分钟. 本文汇总了2018年针对数据科学家/AI的最佳库.repos.包和工具. [ 导读 ]作者根据每周发布总结的系列文章,汇总了2018年针对数据科学 ...

  7. 财务需要学python-财务人要学Python吗?

    财务人要学Python吗? 相信大家都被抖音里"我要悄悄学Python,然后惊艳所有人"的广告刷屏过,作为财务小白应不应该学Python呢? 2020-8-7 14:00:14 上 ...

  8. Python都被用在哪?都有哪些人在用Python呢?

    Python可用的地方非常多,无论是从入门级选手到专业级数据挖掘.科学计算.图像处理.人工智能,Python都可以胜任.或许是因为这种万能属性,周围好更多的小伙伴都开始学习Python.那么,Pyth ...

  9. 应该怎么学python_什么样的人适合学Python,应该怎么学?

    随着现代科技的发展,更多商业模式被移动互联网.大数据.人工智能等高新技术颠覆,新的业态呈现爆发式增长态势,造成IT互联网人才需求不断攀升.尤其是人工智能+Python领域,随着BAT等企业在AI领域的 ...

最新文章

  1. Zookeeper高级
  2. Android stutdio2.2 启动模拟器出现“/dev/kvm is not found.”解决方法
  3. js:进一步关闭(范围:下一个)
  4. vue3.0 视频播放插件(vue-vedio-player)
  5. 中新赛克数据可视化_中新赛克,加仓!
  6. android build.time,Android SDK中的恒定Build.TIME
  7. jquery控制只监听数字_如何在jQuery中监听并保持单击?
  8. sm4 前后端 加密_7 个开源的 Spring Boot 前后端分离优质项目
  9. pandas df.loc
  10. Atitit.mssql 数据库表记录数and 表体积大小统计
  11. 【2019牛客暑期多校训练营(第七场)E】Find the median【权值线段树】
  12. 重学数据结构:三对角矩阵公式推导过程
  13. 卷积神经网络:用于图像分类
  14. 随机划分训练集和测试集
  15. 使用ffpemg无损快速从视频中提取音频的操作教程(记录笔记超详细)
  16. 十年中国WLAN市场霸主,是谁?
  17. 高流明投影仪品牌,这份投影仪行业数据告诉你答案
  18. 对计算机硬件和软件资源进行,网络技术应用下计算机软硬件资源共享的实现
  19. centos8使用技巧与阿贝云服务器
  20. windows硬盘linux无法挂载,关于linux:Ubuntu无法挂载Windows硬盘甚至Windows在双启动时正常关闭...

热门文章

  1. linux jetty9 内存配置,jetty9部署
  2. 如何利用NDI Analysis工具分析NDI流类型
  3. mysql性能瓶颈分析和内存占用高的优化
  4. vip视频测试+GUI初部实验+webbrowser打开网页+安装和实战教程
  5. 记一篇IT培训日记026-小组讨论
  6. 一款全兼容的播放器 videojs
  7. STM32F105RB bootloader jump to app
  8. 入局生成式AI,看好亚马逊(AMZN)中期表现
  9. javaMail发送163企业邮箱
  10. 记一次解决 CMOS sensor 图像闪烁