Problem 68 「Magic 5-gon ring」 †
5角形の変形魔方陣を解く問題。
解法
全探索で間に合います。
出てきた答えの中から目視で選択。
to_num([],Sum,Sum):-!.
to_num([10|Rest],Sum,Result):-
!,
Sum1 is Sum*100+10,
to_num(Rest,Sum1,Result).
to_num([X|Rest],Sum,Result):-
Sum1 is Sum*10+X,
to_num(Rest,Sum1,Result).
board([[_,B,C],[_,C,E],[_,E,G],[_,G,I],[_,I,B]]).
sum3([],Nums,Nums,Sum3,Sum3):-!.
sum3([X|Xs],Nums,ResultNums,Sum3,Wa):-
(integer(X)->Nums1 = Nums;
select(X,Nums,Nums1)),
Sum3A is Sum3+X,
sum3(Xs,Nums1,ResultNums,Sum3A,Wa).
search(_,_,[],[],_):-!.
search(Wa,Nums,[B3|Board],[B3|Result],Min):-
sum3(B3,Nums,Nums1,0,Wa),
[Top|_]=B3,
Min=<Top,
search(Wa,Nums1,Board,Result,Min).
main:-
Nums=[1,2,3,4,5,6,7,8,9,10],
board(Board),
[Top|_]=Board,
sum3(Top,Nums,Nums1,0,Wa),
[Min|_]=Top,
search(Wa,Nums1,Board,Ans,Min),
flatten(Ans,Ans1),
to_num(Ans1,0,Ans2),
Ans2<10^16,
write(Ans2),nl,fail.
最終更新:2014年12月12日 13:53