1

私はErlangが初めてで、数独ソルバーを作ろうとしています。これまでのところ、このように 81 個の整数 (9x9) のリストで構成される入力を取得できます。

sudoku() -> [6,7,1,8,2,3,4,9,5,5,4,9,1,7,6,3,2,8,3,2,8,5,4,9,1,6,7,1,3,2,6,5,7,8,4,9,9,8,6,4,1,2,5,7,3,4,5,7,3,9,8,6,1,2,8,9,3,2,6,4,7,5,1,7,1,4,9,3,5,2,8,6,2,6,5,7,8,1,9,3,4].

stemm によるリスト分割アルゴリズムに基づいて行に分割したこと:

split_rows(sudoku()). 

どちらが返されますか:

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

列を取得するには、この行列をmpm のエレガントなソリューションで転置するだけです。

次のステップは、9 つ​​の正方形のボックスのリストを収集することです。次に、それらのリストに重複する要素があるかどうかを確認して、解決策が有効かどうかを確認できます。

残念ながら、正方形を取得する方法が明確にわかりません。たとえば、

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

ここで、各正方形はブロック内の 9 つの数字を表します。したがって、この場合の正方形は次のようになります。

[5,4,9,
3,2,8,
1,2,2]

これを行う方法を知っている人はいますか?

4

1 に答える 1

2

これに使用できますlists:sublist/3

square(X, Y, Side, Board) ->
    Rows = lists:sublist(Board, (Y-1)*Side + 1, Side),
    [lists:sublist(Row, (X-1)*Side + 1, Side) || Row <- Rows].

リストのリストを返します

1> Board =
[[6,7,1,8,2,3,4,9,5],
 [5,4,9,1,7,6,3,2,8],
 [3,2,8,5,4,9,1,6,7],
 [1,3,2,6,5,7,8,4,9],
 [9,8,6,4,1,2,5,7,3],
 [4,5,7,3,9,8,6,1,2],
 [8,9,3,2,6,4,7,5,1],
 [7,1,4,9,3,5,2,8,6],
 [2,6,5,7,8,1,9,3,4]].

4> so:square(1,1,3,Board). 
[[6,7,1],
 [5,4,9],
 [3,2,8]]
5> so:square(3,3,3,Board).
[[7,5,1],
 [2,8,6],
 [9,3,4]]
6> so:square(2,2,3,Board).
[[6,5,7],
 [4,1,2],
 [3,9,8]]
7> so:square(3,2,3,Board).
[[8,4,9],
 [5,7,3],
 [6,1,2]]

リスト (フラット リスト) だけが必要な場合lists:flatten/1は、 の結果に対して使用しsquare/4ます。

于 2013-10-03T15:22:31.400 に答える