再次写这篇博文,也算是一次回归吧。许久不写文字,发现说话也不太顺溜了,就此以这段开码开个头吧。
题目:一老人带一条狗,同夫妻二人及男孩女孩各俩(七人加一条狗)由河左岸到右岸,有渡船一只,在如下规则下,问多少次方可全部过河?
规则: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行,就此。
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.
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.