猎人过河问题

总结

  1. 对于两个list而言,相同元素但不同的顺序,两者不相等
  2. 对于上述的list,排序之后相等
  3. 把一个列表a加入列表l,此时更改列表a后,l里面的列表也随之更改,因为愿链表只是将一个个的元素串起来
  4. 如果想a的改变不影响l中的元素,需要将一份a的复制品加入l。而不能将原链表加入进去。这样写l.append(a[:])
  5. 在读取全局变量的时候,由于本地没有同名局部变量,那么会自动寻找同名全局变量。
    但是如果在函数内修改局部变量,比如:LEFT=1,那么相当于在内部重新定义了一个局部变量,那么函数内部就会覆盖掉同名全局变量。所以需要使用global特别声明。
  6. 有时候调试的时候提示找不到文件:“FileNotFoundError: [Errno 2] No such file or directory: ‘D:\StoreCode\extension-output-#4’”,将程序的相对路径换成绝对路径可以解决。在程序的头部加上:os.chdir(sys.path[0])
  7. 对于一个操作前,要先想清楚这个操作是不是有前提条件。尽可能在处理之前,将所有的可能发生情况都预料到。比如:
  • 访问字典前,key是否存在
  • 移除或者加入前某个元素,所有的容器是否都满足移动的条件
  1. 对于改变状态了之后,是不是要再复原。

题目

一个猎人要带一棵红萝卜,一只狗,两只老虎和一只羊过河.可现在,小船只有3个座位,这人每次最多只能送两样东西过河.先带谁去呢?没有狗看管,老虎会吃羊,狗和羊单独相处就吵架,山羊与红萝卜在一起,红萝卜就造殃.有什么妙计能帮助它们过河?

代码

import os
from queue import Queue
LEFT = 0
BOAT = 1
RIGHT = 2
q = Queue()
parent_dic = {}#记录父节点
Visited = []#用于记录状态之前是否存在slove = []
left = ['carrot', 'dog', 'hunter', 'sheep', 'tight_1', 'tight_2']#岸左边的人
right = []#岸右边的人
boat = []#船
status = [left, boat, right, LEFT]#记录状态def toString(status_src):#将存储str的二维数组转换为一个字符串local_status = status_src[0:3]i = 0local_status[LEFT].sort()local_status[BOAT].sort()local_status[RIGHT].sort()name = ["left:", "boat:", "right:"]l = ""for ls in local_status: l = l+name[i]for it in ls:l = l+" "+itif i != 2:l = l+"  ||   "i+=1return ldef notVisited(status_src):local_status = status_src[0:3]status_str = toString(local_status)for it in Visited:if status_str == it:return FalseVisited.append(status_str)return Truedef check(status_src):#检查每个组别之中是否有冲突local_status = status_src[0:3]for ls in local_status:#如果人或者狗在,老虎会吃掉羊if ("tight_2" in ls or "tight_1" in ls) and ("sheep" in ls) and ("hunter" not in ls and "dog" not in ls):return False#如果羊和狗单独在一起会吵架if (len(ls) == 2 and "dog" in ls and "sheep" in ls):return False#羊和胡萝卜单独在一起,羊会吃掉胡萝卜if (len(ls) == 2 and "carrot" in ls and "sheep" in ls):return Falsereturn Truedef toAside(status):global LEFTglobal RIGHTif status[3] == 2:LEFT = 2RIGHT = 0status_list = []if "hunter" not in status[LEFT]:print("Error:no man in the side")status[LEFT].remove("hunter")#猎人左脚离开左岸status_ret = [[], [], [], RIGHT] ##船上坐满if len(status[LEFT]) >= 2:#人够for it1 in status[LEFT]:if it1 not in status_ret[BOAT]:status_ret[BOAT].append(it1)for it2 in status[LEFT]:if it1 not in status_ret[BOAT]:status_ret[BOAT].append(it1)if it2 not in status_ret[BOAT]:status_ret[BOAT].append(it2)status_ret[BOAT].append('hunter')#猎人右脚踏上船for l in status[LEFT]:#将没上船的人复制过来if l not in status_ret[BOAT]:status_ret[LEFT].append(l)status_ret[RIGHT] = status[RIGHT][:]#复制过来status_list.append(status_ret)#加入liststatus_ret = [[], [], [], RIGHT]#船上坐两个人if len(status[LEFT]) >= 2:#人够status_ret = [[], [], [], RIGHT]for it1 in status[LEFT]:status_ret[BOAT].append('hunter')#猎人先上status_ret[BOAT].append(it1)for l in status[LEFT]:#左边复制过来if l not in status_ret[BOAT]:status_ret[LEFT].append(l)status_ret[RIGHT] = status[RIGHT][:]#右边复制过来status_list.append(status_ret)#加入liststatus_ret = [[], [], [], RIGHT]#船上坐一个人status_ret[BOAT].append('hunter')status_ret[LEFT] = status[LEFT][:]status_ret[RIGHT] = status[RIGHT][:]status_list.append(status_ret)#检查合法性status[LEFT].append("hunter")#因为要记录父节点,所以将父节点状态复原for it in status_list:     if check(it) and notVisited(it):#如果船上的状态合法#让船上的人上岸,合法性就不管了,这个由出队的时候检查for it2 in it[BOAT]:it[RIGHT].append(it2)it[BOAT] = []parent_dic[toString(it)] = status#记录父节点q.put(it)    #复原状态if status[3] == 2:LEFT = 0RIGHT = 2def findIt(status):if len(status[0]) == 0:#左边为0return Trueelse:return Falsedef whoIsMyFather(status):slove.append(status)if toString(status) not in parent_dic:#如果该key没有父亲return statusreturn whoIsMyFather(parent_dic[toString(status)])def main():q.put(status)while not q.empty():node = q.get()if findIt(node):print("find it:")whoIsMyFather(node)i = len(slove)-1#输出while i >= 0:print(toString(slove[i]))i-=1return nodeif check(node) and notVisited(node):toAside(node)return "无解"if __name__ == "__main__":main()

结果

PYTHON笔记——猎人过河相关推荐

  1. tkinter 笔记: radiobutton 选择按钮(莫烦python笔记)

    1 主体框架还是那个主体框架 window = tk.Tk() window.title('my window') window.geometry('500x500') 2 设置tkinter的文字变 ...

  2. tkinter 笔记:列表部件 listbox (莫烦python 笔记)

    1  主体框架 主体框架部分还是 import tkinter as tkwindow = tk.Tk() #创建窗口window.title('my window') #窗口标题window.geo ...

  3. python笔记: 生成器

    元素按照某种算法推算出来,我们在循环的过程中不断推算出后续的元素 不必创建完整的list,从而节省了大量的空间 这种一边循环一遍计算的机制,称之为生成器generator 1 列表生成器 把列表生成式 ...

  4. python输出字体的大小_Toby的Python笔记 | 预备知识:安装openpyxl学做电子表格

    Toby的Python笔记 | 预备知识:安装openpyxl学做电子表格 Python 需要创建和读取excel表里面的数据,需要用 openpyxl 这个包,今天安装好备用. 首先,进入C命令窗口 ...

  5. c++ 冒泡排序_干货|python笔记1-冒泡排序

    面试的时候经常有面试官喜欢问如何进行冒泡排序?这个问题相信可以难倒一批的同学,本篇就详细讲解如何用python进行冒泡排序. 基本原理 01概念: 冒泡排序是一种交换排序,它的基本思想是:两两比较相邻 ...

  6. python笔记-1(import导入、time/datetime/random/os/sys模块)

    python笔记-6(import导入.time/datetime/random/os/sys模块) 一.了解模块导入的基本知识 此部分此处不展开细说import导入,仅写几个点目前的认知即可.其它内 ...

  7. python慕课笔记_MOOC python笔记(三) 序列容器:字符串、列表、元组

    Python Python开发 Python语言 MOOC python笔记(三) 序列容器:字符串.列表.元组 容器概念 容器是Python中的重要概念,分为有序与无序. 有序容器也称为序列类型容器 ...

  8. python笔记之Cmd模块

    python笔记之Cmd模块 Cmd类型提供了一个创建命令行解析器的框架,默认情况下,它使用readline来进行交互式操作.命令行编辑和命令完成.使用cmd创建的命令行解释器循环读取输入的所有行并且 ...

  9. Python笔记002-列表推导式

    Python笔记002-列表推导式 以下是我学习<流畅的Python>后的个人笔记,现在拿出来和大家共享,希望能帮到各位Python学习者. 首次发表于: 微信公众号:科技老丁哥,ID: ...

最新文章

  1. 每日一皮:妹子们写的代码,Bug为什么这么多?
  2. linux 启动rabbitmq 报错:
  3. 关于Exchange邮箱服务器角色故障排查及解决思路分享
  4. 如何通俗地解释 C、C++、C#、Java、JavaScript、HTML、Python的用处
  5. java 蓝桥杯算法训练 求1加到x的和(number)
  6. 1010.gtest测试环境搭建
  7. Selenium3+python 加载Firefox配置
  8. Tomcat配置HTTPS
  9. 泉金海上航线春节期间航班调整 除夕初一各停航4个班次
  10. go语言中错误处理方式
  11. Ghost命令使用方法
  12. QT tablewidget设置表头
  13. python for maya教程_Python for Maya Fundamentals
  14. 解决多次点击出现蓝色背景
  15. 5 Linux系统编程之网络编程--学习笔记
  16. 19年清北学堂冬令营游记
  17. 处理极端情况:财务扩展和流式传输
  18. oracle关联表查询记录表最新一条记录
  19. 《游戏脚本的设计与开发》-(RPG部分)3.8 通过脚本来自由控制游戏(一)
  20. lucas-kanade学习

热门文章

  1. 记Taro之Button犯的错
  2. 解读JVM级别本地缓存Caffeine青出于蓝的要诀 —— 缘何会更强、如何去上手
  3. js 星星评分 (根据数据显示星星个数)-----简版
  4. 达内python培训学校怎么样
  5. 【BERT】Transformer理论详解(一)
  6. Linux C高阶(7)异步处理框架C实现
  7. K. Browser Games
  8. JavaScript JS合并单元格 rowspan
  9. LeetCode第176场周赛(Weekly Contest 176)解题报告
  10. 装饰者模式 大嘴的身份