人工智能-传教士和食人者问题 python
【传教士和食人者问题】
在河的左岸有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相关推荐
- 编程解决 传教士和食人者问题
很简单的搜索,但是其中的条件还是太多,卡了好久 ans : 解法个数 m1[],m2[] 中记录船只上的传教士和食人者方案,负数表示船由西向东航行,整数相反.例如m1[i] = -1,m2[i] = ...
- 用空间状态法求解传教士和食人者问题
空间状态法求解传教士和食人者问题 问题描述: 问题解决: (1)确定状态变量及确定值域: 设左岸传教士.野人.船的数目分别为:m,c,b:则右岸相应的数目为:3-m,3-c,1-b; (2)确定状态组 ...
- 传教士与食人者问题python
问题描述 在河的左岸有3个传教士.1条船和3个食人者,传教士们想用这条船将所有的成员运到河的右岸,但是受到以下条件的限制: (1)船每次最多只能装2个乘客(传教士和食人者都会划船). (2)在任何岸边 ...
- 人工智能导论实验二 食人族传教士过河+黑白棋 prolog+Python
实验目的及要求: 本项目要求能够理解人工智能的基本原理,理解状态空间的概念.原理和方法,掌握用状态空间表示问题的步骤,掌握搜索方法的基本原理,并能够实际问题给出具体的实现. 实验内容: 状态.状态空间 ...
- 哪些人适合参加Python培训班?
哪些人适合参加Python培训班?确实,不是所有人都适合参加Python培训班的,有一定基础的同学会选择自学,零基础的同学比较适合参加Python培训班,来看看下面的具体介绍. 哪些人适合参加Pyth ...
- 必备 | 人工智能和数据科学的七大 Python 库
来源:新智元 本文约3100字,建议阅读10+分钟. 本文汇总了2018年针对数据科学家/AI的最佳库.repos.包和工具. [ 导读 ]作者根据每周发布总结的系列文章,汇总了2018年针对数据科学 ...
- 财务需要学python-财务人要学Python吗?
财务人要学Python吗? 相信大家都被抖音里"我要悄悄学Python,然后惊艳所有人"的广告刷屏过,作为财务小白应不应该学Python呢? 2020-8-7 14:00:14 上 ...
- Python都被用在哪?都有哪些人在用Python呢?
Python可用的地方非常多,无论是从入门级选手到专业级数据挖掘.科学计算.图像处理.人工智能,Python都可以胜任.或许是因为这种万能属性,周围好更多的小伙伴都开始学习Python.那么,Pyth ...
- 应该怎么学python_什么样的人适合学Python,应该怎么学?
随着现代科技的发展,更多商业模式被移动互联网.大数据.人工智能等高新技术颠覆,新的业态呈现爆发式增长态势,造成IT互联网人才需求不断攀升.尤其是人工智能+Python领域,随着BAT等企业在AI领域的 ...
最新文章
- Zookeeper高级
- Android stutdio2.2 启动模拟器出现“/dev/kvm is not found.”解决方法
- js:进一步关闭(范围:下一个)
- vue3.0 视频播放插件(vue-vedio-player)
- 中新赛克数据可视化_中新赛克,加仓!
- android build.time,Android SDK中的恒定Build.TIME
- jquery控制只监听数字_如何在jQuery中监听并保持单击?
- sm4 前后端 加密_7 个开源的 Spring Boot 前后端分离优质项目
- pandas df.loc
- Atitit.mssql 数据库表记录数and 表体积大小统计
- 【2019牛客暑期多校训练营(第七场)E】Find the median【权值线段树】
- 重学数据结构:三对角矩阵公式推导过程
- 卷积神经网络:用于图像分类
- 随机划分训练集和测试集
- 使用ffpemg无损快速从视频中提取音频的操作教程(记录笔记超详细)
- 十年中国WLAN市场霸主,是谁?
- 高流明投影仪品牌,这份投影仪行业数据告诉你答案
- 对计算机硬件和软件资源进行,网络技术应用下计算机软硬件资源共享的实现
- centos8使用技巧与阿贝云服务器
- windows硬盘linux无法挂载,关于linux:Ubuntu无法挂载Windows硬盘甚至Windows在双启动时正常关闭...