Bert Bos Puzzleで作業します。ここでは、シーケンスのすべての可能な順列(クリックまたはクリックなし)を印刷して、赤色の全体が赤くなるようにする必要があります。これは、一連のクリックの中で一番上の行をクリックしてクリックすることによって行われます。その後、次の行に移動し、そこに四角形をクリックすると、最初の行がすべて赤になります。あなたはこのようなパズルを進んで、正方形全体を赤に変えるまで進めます。Bert Bosパズルのテストソリューション
4x4四角形の可能な解決策は、最初の行で[クリック、クリック、クリックしない、クリックしない]です。下の行のいずれかのパターンに従わなくても、次の行のすべてのブロックが赤色になり、すべての四角が赤色になるまで反転し続けるだけです。
サイズNの正方形の最初の行に対して、「クリック」と「クリックしない」のすべての可能な順列をテストする述語を書こうとしています。今すぐ、色のトラックを維持して一番上の行をクリックした後、それを使用して2番目の行のどの四角形をクリックして一番上の行をすべて赤色にするかを指定します。
問題は、最初の行からのクリックによって変更された2番目の行の色を追跡する方法を理解してから、2番目の行のクリックを追跡する方法と、残りの行どんな助けでも大歓迎です。あなたは(述語の引数を使用して)に沿って行列を運ぶことができ、かつ常に現在の状態を検査するためにこれを使用します。ここでは
は@CapelliCがすでに一つの可能なアプローチを示唆している
state(no_click).
state(click).
flip(blue, red).
flip(red, blue).
board_permutations(0,[]):- !.
board_permutations(N, [H|T]) :-
state(H),
N1 is N - 1,
board_permutations(N1, T).
first_row_solutions([], []).
first_row_solutions([H1, H2|T], [FirstRow|SecondRow]):-
H1 = click,
flip(H1,C),
flip(H2,C),
first_row_solutions(H2, FirstRow).
first_row_solutions([H|T], [FRH1, FRH2, FRH3|FRT], [SR1, SR2, SR3|SRT]) :-
H = click,
flip(FRH1, C1),
flip(FRH2, C2),
flip(FRH3, C3),
%flip(SR1, S1), I was thinking I could keep track of the second row colors here
%flip(SR2, S2),
%flip(SR3, S3)
%FlipListRow1 = [C1, C2, C3 | T],
%FlipListRow2 = [S1, S2, S3|T],
first_row_solutions(H, FRH3).
%Possible predicate to handle row 2, 3, 4 etc --> ClickList is what clicks to do on row 3 to make row 2 red, etc
%row_n_solutions(FlipListRow2, ClickList)
generate_board(0, [], _).
generate_board(N, [H|T], ConstantN) :-
generate_row(ConstantN, H),
N =< 12, N >= 1,
N2 is N-1,
generate_board(N2, T, ConstantN).
generate_row(0, []) :- !.
generate_row(N, [H | T]) :-
N =< 12, N >= 1,
N2 is N-1,
H = blue,
generate_row(N2, T).
test(X) :- generate_board(5,X,5).
test1(X) :- solutions([no_click, click, no_click, no_click], X).
私はBTW(リストのリストは、このパズルのために簡単にデータ表現ではないと思われます、著者名はB ** e ** rt Bosです)。あなたは、マトリックス全体を運び、すべての試み(クリック)で3行(または2行)を変更するという選択肢はありません。 – CapelliC