3

プロローグでブロックのすべての要素を取得する方法は? 私のコードではサイズが動的に変化する可能性があるため、ブロックサイズは異なります。4x4 = 4 要素、9x9 = 9 要素などです。ブロックは正方形にカットされるため、4x4 では水平方向の長さは round(sqrt(4))= 2 で、垂直方向はブロックの長さは round(sqrt(4)) = 2. および 9x9 ... sqrt(9).. なので、ブロックの高さと幅は 3 です。要素を効率的に取得するためのアルゴリズムが必要です。

私のsudokulistsはこのように構築されています:

L=[ [4,3,1,2], [2,1,4,3], [3,4,2,1], [1,2,3,4] ],

数独の行のリストを含むリストです。行と列のチェックは問題ありません。 -> 行の all_different チェック、リスト全体の転置、転置されたリストの all_different チェック。

しかし、数独の動的サイズのため、ブロックの修正コードをコーディングできません。誰かアイデアはありますか?flatten(L) とオフセットを使用して正しいブロックを取得することを考えましたが、この方法でそれを行うのはかなり難しいようですか?

私を助けてください!

4

2 に答える 2

2

考えられる解決策は次のとおりです (サイズxのblocksizexblocksize個のブロックがあると仮定します。標準的な数独ではすべての数字が等しく、他のレイアウトに合わせて調整できます)blocksizeblocksize

  1. バケットa = [],...,[]のリストとしましょう。blocksize
  2. 各行をblocksizeパーツに分割します。
  3. 最初の部分を最初のバケットに入れ、2 番目を 2 番目に入れます。最後のバケットに到達した場合は、最初のバケットからもう一度開始します。
  4. a完全に平らにする
  5. blocksize結果を再度xblocksizeブロックに分割します

あなたの例では:

L=[ [4,3,1,2], [2,1,4,3], [3,4,2,1], [1,2,3,4] ]
Partitions => [[4,3] [1,2] [2,1] [4,3] [3,4] [2,1] [1,2] [3,4]]
Bucketed => [[4,3] [2,1] [3,4] [1,2]] [[1,2] [4,3] [2,1] [3,4]]
Flattened => [4,3,2,1,3,4,1,2,1,2,4,3,2,1,3,4]
Partitioned => [4,3,2,1], [3,4,1,2], [1,2,4,3], [2,1,3,4]]
于 2011-06-04T16:01:45.253 に答える
1

リストリスト表現で行列を転置するための簡単なPrologを次に示します。アイデアは、既存の各行から頭を引っ張って新しい「最初の行」を作成し、次に「残りの」テールのリストで再帰することです。

transpose([[ ]|_],[ ]) :- !.
transpose(A,[H|T]) :-
    decap_List(A,H,B),
    transpose(B,T).

decap_List([ ],[ ],[ ]).
decap_List([[H|T]|Rows],[H|Hs],[T|Ts]) :-
    decap_List(Rows,Hs,Ts).

例えば:

?- transpose([[1,2,3],[4,5,6],[7,8,9]],X).

X = [[1, 4, 7], [2, 5, 8], [3, 6, 9]] 

ただし、サイズK²xK²の一般化された数独行列の場合、行列をタイリングするサイズKxKの各「ボックス」に「すべて異なる」エントリがあることに注意してください。以前と同じ設計を使用すると、数独行列を「ボックス」リストのリストに再パッケージ化するための述語も必要になります。

これを行うには、行列をK行のグループに「分割」するための追加の述語のみが必要です。

part_K_rows([ ],_,[ ]) :- !.
part_K_rows(A,K,[H|T]) :-
    get_K_rows(A,K,H,B),
    part_K_rows(B,K,T).

get_K_rows(A,0,[ ],A) :- !.
get_K_rows([H|T],K,[H|Z],B),
    J is K-1,
    get_K_rows(T,J,Z,B).

part_K_rows / 3を元の数独行列に適用してから、結果の各行パーティションを転置し、part_K_rows / 3をそれぞれに適用すると、必要な「ボックス」リストのリストが生成されます。

于 2011-06-04T19:26:33.247 に答える