09/12/23 03:34:55
>>15
% Prolog
入力したデータセットを一枚交換して合計が一致する組をすべて示す(AL,BL,A,B) :-
データセットの入力(N,M,AL,BL),
一枚ずつ全てを交換してみる(N,M,AL,BL,A,B).
データセットの入力(N,M,AL,BL) :- get_split_line([' '],[N,M]),\+((N=0,M=0)),'Aの入力'(N,AL),'Bの入力'(M,BL),!.
'Aの入力'(N,AL) :- findall(A,(for(1,_,N),get_integer(A)),AL).
'Bの入力'(M,AL) :- findall(B,(for(1,_,M),get_integer(B)),BL).
一枚ずつ全てを交換してみる(0,M,AL,BL,_,_) :- !,fail.
一枚ずつ全てを交換してみる(N,M,AL,BL,A,B) :-
ならびの回転(左方向,1,AL,[A|R1]),
交換して合計が一致する(M,BL,A,B).
一枚ずつ全てを交換してみる(N,M,AL,BL,A,B) :-
ならびの回転(左方向,1,AL,AL2),
N1 is N - 1,
一枚ずつ全てを交換してみる(N1,M,AL2,BL,A,B).
交換して合計が一致する(0,[A|R1],[B|R2],A,B) :- !,fail.
交換して合計が一致する(M,[A|R1],[B|R2],A,B) :- sum([B|R1],Sum), sum([A|R2],Sum).
交換して合計が一致する(M,[A|R1],[B|R2],A,B) :-
ならびの回転(左方向,1,BL,BL2),
M1 is M - 1,
交換して合計が一致する(M1,[A|R1],BL2,A,B).