Re: [卡關] 五人過橋
※ 引述《Satyria (零分!零分!)》之銘言:
: http://www.plastelina.net/examples/games/game3.html
: 先別急著噓
: 相信很多人都玩過
: 29秒過大家應該都會
: 可是老師說30秒也可以過
: 而且也有同學試出來
: 可是我想不到
: 請各位幫幫我
寫了Prolog程式解這題. 經過查詢:
?- move([1,3,6,8,12], [], Ss, Sq), Ss =< 30.
Sq = [[1,3],[1],[6,1],[1],[8,12],[3],[1,3]]
Ss = 29
... (以下很多29的解)
?- move([1,3,6,8,12], [], Ss, Sq), Ss = 30.
no
30步沒有解,29步的解不少,再多一點有31步和33步的解.
以下是程式,沒興趣的別往下看.
%% --------------------------------------------
move(FromSet, _, Seconds, [FromSet]) :-
length(FromSet, N1), N1 =< 2, !,
max_num(FromSet, Seconds).
move(FromSet, ToSet, Seconds, [Sent,Back|Sequence]) :-
combination1(2, FromSet, Sent, FromSet1),
append(Sent, ToSet, ToSet1),
combination1(1, ToSet1, Back, ToSet2),
append(FromSet2, ToSet2, S1, Sequence),
max_num(Sent, S2), max_num(Back, S3),
Seconds is S1 + S2 + S3.
max_num([], 0).
max_num([X|Y], X) :- max_num(Y, N), X > N.
max_num([X|Y], N) :- max_num(Y, N), X =< N.
combination1(0, _, [], []).
combination1(1, X, [Z]) :- element_at(X, _, Z), set_diff(X, [Z], Z1).
combination1(N, X, [Z1|Z2]) :-
N > 1, N1 is N - 1, combination1(1, X, [Z1], _),
combination1(N1, X, Z2, Z3), not(element_at(Z2, _, Z1)),
set_diff(Z3, [Z1], Z4).
set_diff([], _, []).
set_diff([X|Y1], Y2, Z) :- element_at(Y2, _, X), !, set_diff(Y1, Y2, Z).
set_diff([X|Y1], Y2, [X|Z]) :- set_diff(Y1, Y2, Z).
element_at([X|_], 1, X).
element_at([_|Y], N, Z) :- element_at(Y, N1, Z), N is N1 + 1.
not(X) :- call(X), !, fail.
not(X) :- true.
%% ---------------------------------------------------
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.112.228.190
推
10/27 18:41, , 1F
10/27 18:41, 1F
推
10/27 21:23, , 2F
10/27 21:23, 2F
→
10/27 21:56, , 3F
10/27 21:56, 3F
※ 編輯: yauhh 來自: 59.112.228.190 (10/27 22:53)
推
10/27 22:56, , 4F
10/27 22:56, 4F
討論串 (同標題文章)
Little-Games 近期熱門文章
PTT遊戲區 即時熱門文章