过河问题(lua版)

逍遥云 posted @ 2015年4月03日 20:26 in Lua with tags Lua 过河 迷题 , 4869 阅读

再次写这篇博文,也算是一次回归吧。许久不写文字,发现说话也不太顺溜了,就此以这段开码开个头吧。

题目:一老人带一条狗,同夫妻二人及男孩女孩各俩(七人加一条狗)由河左岸到右岸,有渡船一只,在如下规则下,问多少次方可全部过河?

规则:1. 可撑船有三人:老人,丈夫,妻子。2. 渡船每次至多携带两位,但至少有一位撑船者。3. 狗在老人的掌控之下才不会伤及他人,但可独处。4. 丈夫喜男孩而不喜女孩,故男孩不可与妻子独处。5. 妻子喜欢女孩而不喜男孩,故女孩不可与丈夫独处

 

lua的解决代码:

local live = {
    "oldman",
    "dog",
    "husband",
    "wife",
    "boy",
    "girl",
}

local group = {
    "oldman", "dog", 
    "oldman", "boy",
    "oldman", "girl",
    "wife", "girl",
    "husband", "boy",
    "wife", "oldman",
    "husband", "oldman",
    "husband", "wife",
    "husband", false,
    "oldman", false,
    "wife", false, 
}

local round = 0
local left, lefthistory, right, righthistory = {}, {}, {}, {}

local function print_side(side)
    print(string.format("side:%d, n=%d, oldman=%d, dog=%d, husband=%d, wife=%d, boy=%d, girl=%d"
            , side.flag and 1 or 0, side.n, side.oldman, side.dog, side.husband, side.wife, side.boy, side.girl))
end

local function isferryman(live)
    return live == "oldman" or live == "wife" or live == "husband"
end

local function checkload(side, ferryman, host)
    if side[ferryman] <= 0 then return false end
    if side[host] ~= nil and side[host] <=0 then return false end
    return true
end

local function checkside(side)
    if side.oldman == 0
        and side.n > 1
        and side.dog == 1 then
        return false
    end

    if side.husband == 0
        and side.wife == 1
        and side.boy > 0 then
        return false
    end

    if side.husband == 1
        and side.wife == 0
        and side.girl > 0 then
        return false
    end

    return true
end


local function compareside(a, b)
    for k, v in pairs(a) do
        if a[k] ~= b[k] then return false end 
    end

    return true
end


local function checkhistory(side)
    local history = side.flag and righthistory or lefthistory

    for i = 1, #history do
        if compareside(side, history[i]) then return false end
    end

    return true
end

local function copyside(side)
    local target = {}
    for k, v in pairs(side) do
        target[k] = v
    end

    return target
end

local function onboat(side, ferryman, host)
    side[ferryman] = side[ferryman] - 1
    side.n = side.n - 1
    if host then
        side[host] = side[host] - 1
        side.n = side.n - 1
    end
end

local function downboat(side, ferryman, host)
    side[ferryman] = side[ferryman] + 1
    side.n = side.n + 1
    if host then
        side[host] = side[host] + 1
        side.n = side.n + 1
    end
end

local function gothrough(startside, endside, flag)
    if flag and endside.n == 0 then return true end

    local ferryman, host

    local i, z, s
    if flag then
        i = #group - 1
        z = 1
        s = -2
    else
        i = 1
        z = #group
        s = 2
    end

    for i = i, z, s do
        if isferryman(group[i]) then
            ferryman = group[i]
            host = group[i + 1]

            if checkload(startside, ferryman, host) then
                onboat(startside, ferryman, host)
                downboat(endside, ferryman, host)

                if checkside(startside) and checkside(endside) then

                    if checkhistory(startside) then
                        if flag then
                            righthistory[#righthistory + 1] = copyside(startside)
                        else
                            lefthistory[#lefthistory + 1] = copyside(startside)
                        end

                        if gothrough(endside, startside, not flag) then
                            round = round + 1
                            print(string.format("round:%d left%s--%sright, ferryman:%s, host:%s"
                            , round
                            , startside.flag and "<" or ""
                            , startside.flag and "" or ">"
                            , ferryman
                            , host or ""))
                            return true
                        end
                    end
                end

                onboat(endside, ferryman, host)
                downboat(startside, ferryman, host)

            end
        end
    end

end

local function init_data()

    left.n = 8
    left.flag = false

    right.n = 0
    right.flag = true

    for _, v in ipairs(live) do
        left[v], right[v] = 1, 0
    end
    left.boy = 2
    left.girl = 2

end

local function start()
    init_data()

    print("orginal data:")
    print_side(left)
    print_side(right)

    print("begin puzzle:")
    if gothrough(left, right, false) then
        print("finished data:")
    else
        print("fail puzzle!")
    end

    print_side(left)
    print_side(right)
end

local function main()
    start()
end

main()

博主先写的C版,后拿lua来练了个手,发现代码还能少50行,就此。

  • 无匹配
Avatar_small
residential cleaning 说:
2021年10月01日 18:08

A few companies don't wish to take time to hire brand new employees or help with the effort to keep a janitorial personnel. This will take lots of money due towards the need with regard to specialized machines essential for situations such as floor buffing with regard to wax flooring. It is more modest for the majority of companies to employ outside company cleaning providers. if you are looking at contracting an expert cleaner or even company for the facilities, it is advisable to get several estimates. Talk to a couple different contractors before you decide to make your ultimate decision. This will make sure that you are obtaining the best price for the business' requirements. You may appreciate understanding that you compared the costs and services of the few various companies before making the decision.

Avatar_small
AP SSC History Model 说:
2022年9月15日 23:09

History can guide learners to see trends and processes from a broader, holistic perspective and to understand them. Through History, they come into contact with other cultures and societies and in this way they gain a more holistic understanding of the contemporary world and their place in this broader context. Telugu Medium, AP SSC History Model Paper English Medium & Urdu Medium Students of the State Board can download the AP 10th History Model Paper 2023 Pdf with Answers designed based on the revised syllabus and curriculum of the course. Class teachers and leading institutional experts are designed and suggested the Part-A, Part-B, Part-C, and Part-D exams like SA-1, SA-2, FA-1, FA-2, FA-3, FA-4 along with Assignments.


登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter