全探索して全ケースで検討すべきかをチェック。
小さいほうどうしから順にワンセットとして比べて、片方が片方に全部負けてるなら検討する必要なし。
他の人は数式一発で解いてそうだなこれ。
check([],[],0,_,_):-!,fail.
check([],[],_,0,_):-!,fail.
check([],[],_,_,1):-!.
check([X|Xs],[Y|Ys],C1,C2,Result):-
X>Y,
!,
C11 is C1+1,
check(Xs,Ys,C11,C2,Result).
check([_|Xs],[_|Ys],C1,C2,Result):-
!,
C22 is C2+1,
check(Xs,Ys,C1,C22,Result).
selects([],_):-!.
selects([X|Xs],Nums):-
append(_,[X|Nums1],Nums),
selects(Xs,Nums1).
delete([],Result,Result):-!.
delete([X|Xs],Nums,Result):-
select(X,Nums,Nums1),
delete(Xs,Nums1,Result).
seed(0,[]):-!.
seed(N,[_|Result]):-
N1 is N-1,
seed(N1,Result).
search(E):-
A1=[1,2,3,4,5,6,7,8,9,10,11,12],
between(2,6,S),
seed(S,L1),
seed(S,L2),
selects(L1,A1),
delete(L1,A1,A2),
selects(L2,A2),
check(L1,L2,0,0,E).
main:-
findall(E,search(E),Es),
length(Es,Ans),
Ans1 is Ans//2,
write(Ans1).
最終更新:2015年01月07日 02:47