-- zagadka: обойти начиная с 1-го 16 этажей, побывав на каждом лишь 1 раз, -- переходы между этажами разрешены только на 3, либо 5 этажей вверх/вниз. local len=16 local t,t1 = {},{} local d={-5,3,5,-3} local st=function(x) local t0={} for i=1,#d do local r=x+d[i] if r>=1 and r<=len and not t[r] then table.insert(t0,d[i]) end end table.insert(t1,t0) end local src=function(x) for k,v in pairs(t) do if v==x then return k end end end local fst,count = 1,1 -- старт с 1-го этажа local l=fst -- текущий этаж while true do local sub=function() t[l]=l+t1[#t1][#t1[#t1]] l=t[l] end st(l) if #t1[#t1]>0 then sub() else if #t1==len and l==t1[1][#t1[1]-1]+fst --if #t1==len and (l==4 or l==6) then t[l]=fst break else while #t1[#t1]<2 do table.remove(t1) t[l]=nil l=src(l) end table.remove(t1[#t1]) sub() end end count=count+1 end local s=#t1..": "..fst for i=1,#t1 do fst=t[fst] s=s.." "..fst end far.Message(s,count) |