• 传教士野蛮人过河问题python


    三名传教士和三个野蛮人同在一个小河渡口,渡口上只有一条可容两人的小船。问题的目标是要用这条小船把这六个人全部渡到对岸去,条件是在渡河的过程中,河两岸随时都保持传教士人数不少于野蛮人的人数,否则野蛮人会把处于少数的传教士吃掉。这六个人怎样才能安全渡过去?

    状态集合为(x,y,b)三元组,x表示左岸野人数,y表示左岸传教士数,x,y取值0~3。b为0表示船在左边,b为1表示船在右边
    动作集合为一个传教士从左到右,两个传教士从左到右,一个野人从左到右,两个野人从左到右,一个野人一个传教士从左到右;从右到左类似也有5个动作,共10个动作,于是就可以画出一个状态转换图,下面的python代码可以帮助我们完成这个任务(主要是用来练练python- -,所以看起来幼稚一点,别见怪^_^)。

    state_legal判断给定状态是否合法,act_legal判断在当前状态执行给定动作是否合法,f(x,y,b)打印所有从(x,y,b)可以执行的动作和转移到的状态
    def state_legal(x, y, b):
        if x < 0 or y < 0 or x > 3 or y > 3:
            return False
        if y < x and y > 0:
            return False
        elif (3-y) < 3-x and 3-y > 0:
            return False
        else:
            return True
    def act_legal(x, y, b, xx, yy, bb):
        if b != bb:
            return False
        if b == 0 and state_legal(x - xx, y - yy, 1 - b):
            return True
        elif b == 1 and state_legal(x + xx, y + yy, 1 - b):
            return True
        else:
            return False
    #when calling f, (x,y,b) is ensured to be state_legal
    def f(x,y,b):
        for act in actions:
            if act_legal(x, y, b, act[0], act[1], act[2]):
                if act[2] == 0:
                    print(x,y,b,"---",act, '---', x - act[0], y - act[1], 1 - b)
                else:
                    print(x,y,b,"---",act, '---', x + act[0], y + act[1], 1 - b)
    a = (0,1,2,3)
    actions = []
    for b in (0,1):
        for x in (0,1,2):
            for y in (0,1,2):
                if x + y >= 1 and x + y <= 2:
                    actions.append((x,y,b))
    print(actions)
    
    for x in a:
        for y in a:
            for b in (0,1):
                if not(x == 0 and y == 0) and state_legal(x, y, b):
                    f(x,y,b)
    
    
    
    
    #x is num of savages, y is num of missionaries
  • 相关阅读:
    js变量的作用域问题
    HTML网页公用头部与尾部的一些方法
    拖动对象ondrag
    子div设置float后导致父div无法自动撑开的问题
    js像素运算问题
    js自动轮播图片的两种循环方法(原创)
    display:none显示和隐藏
    Linux shell脚本基础学习详细介绍(完整版)一
    java技术思维导图(转载)
    VIM编辑命令的技巧
  • 原文地址:https://www.cnblogs.com/fstang/p/2967150.html
Copyright © 2020-2023  润新知