我怎样才能改变数独的大小
How can i change size of sudoku
我有一个脚本可以解决大小为 9*9 的数独问题
我有 81 个变量,我为它们定义了规则,
如何更改此代码以解决任意大小的数独问题?
例如,对于 16*16 的数独,规则将适用于 4*4 的子方块。
去(大):-
L=[A1,A2,A3,A4,A5,A6,A7,A8,A9,
B1,B2,B3,B4,B5,B6,B7,B8,B9,
C1,C2,C3,C4,C5,C6,C7,C8,C9,
D1,D2,D3,D4,D5,D6,D7,D8,D9,
E1,E2,E3,E4,E5,E6,E7,E8,E9,
F1,F2,F3,F4,F5,F6,F7,F8,F9,
G1,G2,G3,G4,G5,G6,G7,G8,G9,
H1,H2,H3,H4,H5,H6,H7,H8,H9,
I1,I2,I3,I4,I5,I6,I7,I8,I9],
fd_domain(L,1,9),</p>
<pre><code> fd_alldifferent([A1,A2,A3,A4,A5,A6,A7,A8,A9]),
fd_alldifferent([B1,B2,B3,B4,B5,B6,B7,B8,B9]),
fd_alldifferent([C1,C2,C3,C4,C5,C6,C7,C8,C9]),
fd_alldifferent([D1,D2,D3,D4,D5,D6,D7,D8,D9]),
fd_alldifferent([E1,E2,E3,E4,E5,E6,E7,E8,E9]),
fd_alldifferent([F1,F2,F3,F4,F5,F6,F7,F8,F9]),
fd_alldifferent([G1,G2,G3,G4,G5,G6,G7,G8,G9]),
fd_alldifferent([H1,H2,H3,H4,H5,H6,H7,H8,H9]),
fd_alldifferent([I1,I2,I3,I4,I5,I6,I7,I8,I9]),
fd_alldifferent([A1,B1,C1,D1,E1,F1,G1,H1,I1]),
fd_alldifferent([A2,B2,C2,D2,E2,F2,G2,H2,I2]),
fd_alldifferent([A3,B3,C3,D3,E3,F3,G3,H3,I3]),
fd_alldifferent([A4,B4,C4,D4,E4,F4,G4,H4,I4]),
fd_alldifferent([A5,B5,C5,D5,E5,F5,G5,H5,I5]),
fd_alldifferent([A6,B6,C6,D6,E6,F6,G6,H6,I6]),
fd_alldifferent([A7,B7,C7,D7,E7,F7,G7,H7,I7]),
fd_alldifferent([A8,B8,C8,D8,E8,F8,G8,H8,I8]),
fd_alldifferent([A9,B9,C9,D9,E9,F9,G9,H9,I9]),
fd_alldifferent([A1,A2,A3,B1,B2,B3,C1,C2,C3]),
fd_alldifferent([A4,A5,A6,B4,B5,B6,C4,C5,C6]),
fd_alldifferent([A7,A8,A9,B7,B8,B9,C7,C8,C9]),
fd_alldifferent([D1,D2,D3,E1,E2,E3,F1,F2,F3]),
fd_alldifferent([D4,D5,D6,E4,E5,E6,D4,D5,D6]),
fd_alldifferent([D7,D8,D9,E7,E8,E9,D7,D8,D9]),
fd_alldifferent([G1,G2,G3,H1,H2,H3,I1,I2,I3]),
fd_alldifferent([G4,G5,G6,H4,H5,H6,I4,I5,I6]),
fd_alldifferent([G7,G8,G9,H7,H8,H9,I7,I8,I9]),
fd_labeling([A1,A2,A3,A4,A5,A6,A7,A8,A9,
B1,B2,B3,B4,B5,B6,B7,B8,B9,
C1,C2,C3,C4,C5,C6,C7,C8,C9,
D1,D2,D3,D4,D5,D6,D7,D8,D9,
E1,E2,E3,E4,E5,E6,E7,E8,E9,
F1,F2,F3,F4,F5,F6,F7,F8,F9,
G1,G2,G3,G4,G5,G6,G7,G8,G9,
H1,H2,H3,H4,H5,H6,H7,H8,H9,
I1,I2,I3,I4,I5,I6,I7,I8,I9]).
我应该写另一个脚本还是我可以更改这个脚本?
谢谢,
代码需要重写才能适用于一般情况。目前它在所有维度上都是 hard-coded,因此不能仅仅通过调整来概括它。
这是一个示例,向您展示如何使用 maplist
作为解决此类问题的工具。它不是您问题的完整解决方案,但应该可以帮助您入门。
% Auxiliary predicates that will be maplist-friendly (the list is the last argument)
%
length_(N, L) :- length(L, N).
fd_domain_(Min, Max, L) :- fd_domain(L, Min, Max).
constrained_matrix(N, Matrix) :-
length(Matrix, N), % Matrix has N elements
maplist(length_(N), Matrix), % Each element of Matrix has N elements
maplist(fd_domain_(1, N), Matrix), % The domain of each sublist is 1 to N
maplist(fd_all_different, Matrix), % Each sublist must have elements all different
maplist(fd_labeling, Matrix).
和运行这样的查询:
| ?- constrained_matrix(3, L).
L = [[1,2,3],[1,2,3],[1,2,3]] ? ;
L = [[1,2,3],[1,2,3],[1,3,2]] ? ;
L = [[1,2,3],[1,2,3],[2,1,3]] ? ;
L = [[1,2,3],[1,2,3],[2,3,1]] ? ;
...
如您所见,解决方案集是所有 3x3 矩阵,其中行具有唯一元素,但列可以是任何内容。您可以通过可以转置矩阵的 writing/using Prolog 谓词添加更多约束(在 Matrix
中交换行与列)并再次使用 maplist
来约束列。您可以根据需要为子方块添加更多约束(例如,编写一个谓词来提取子矩阵,并充分利用 maplist
)。
我有一个脚本可以解决大小为 9*9 的数独问题 我有 81 个变量,我为它们定义了规则,
如何更改此代码以解决任意大小的数独问题? 例如,对于 16*16 的数独,规则将适用于 4*4 的子方块。
去(大):-
L=[A1,A2,A3,A4,A5,A6,A7,A8,A9,
B1,B2,B3,B4,B5,B6,B7,B8,B9,
C1,C2,C3,C4,C5,C6,C7,C8,C9,
D1,D2,D3,D4,D5,D6,D7,D8,D9,
E1,E2,E3,E4,E5,E6,E7,E8,E9,
F1,F2,F3,F4,F5,F6,F7,F8,F9,
G1,G2,G3,G4,G5,G6,G7,G8,G9,
H1,H2,H3,H4,H5,H6,H7,H8,H9,
I1,I2,I3,I4,I5,I6,I7,I8,I9],
fd_domain(L,1,9),</p>
<pre><code> fd_alldifferent([A1,A2,A3,A4,A5,A6,A7,A8,A9]),
fd_alldifferent([B1,B2,B3,B4,B5,B6,B7,B8,B9]),
fd_alldifferent([C1,C2,C3,C4,C5,C6,C7,C8,C9]),
fd_alldifferent([D1,D2,D3,D4,D5,D6,D7,D8,D9]),
fd_alldifferent([E1,E2,E3,E4,E5,E6,E7,E8,E9]),
fd_alldifferent([F1,F2,F3,F4,F5,F6,F7,F8,F9]),
fd_alldifferent([G1,G2,G3,G4,G5,G6,G7,G8,G9]),
fd_alldifferent([H1,H2,H3,H4,H5,H6,H7,H8,H9]),
fd_alldifferent([I1,I2,I3,I4,I5,I6,I7,I8,I9]),
fd_alldifferent([A1,B1,C1,D1,E1,F1,G1,H1,I1]),
fd_alldifferent([A2,B2,C2,D2,E2,F2,G2,H2,I2]),
fd_alldifferent([A3,B3,C3,D3,E3,F3,G3,H3,I3]),
fd_alldifferent([A4,B4,C4,D4,E4,F4,G4,H4,I4]),
fd_alldifferent([A5,B5,C5,D5,E5,F5,G5,H5,I5]),
fd_alldifferent([A6,B6,C6,D6,E6,F6,G6,H6,I6]),
fd_alldifferent([A7,B7,C7,D7,E7,F7,G7,H7,I7]),
fd_alldifferent([A8,B8,C8,D8,E8,F8,G8,H8,I8]),
fd_alldifferent([A9,B9,C9,D9,E9,F9,G9,H9,I9]),
fd_alldifferent([A1,A2,A3,B1,B2,B3,C1,C2,C3]),
fd_alldifferent([A4,A5,A6,B4,B5,B6,C4,C5,C6]),
fd_alldifferent([A7,A8,A9,B7,B8,B9,C7,C8,C9]),
fd_alldifferent([D1,D2,D3,E1,E2,E3,F1,F2,F3]),
fd_alldifferent([D4,D5,D6,E4,E5,E6,D4,D5,D6]),
fd_alldifferent([D7,D8,D9,E7,E8,E9,D7,D8,D9]),
fd_alldifferent([G1,G2,G3,H1,H2,H3,I1,I2,I3]),
fd_alldifferent([G4,G5,G6,H4,H5,H6,I4,I5,I6]),
fd_alldifferent([G7,G8,G9,H7,H8,H9,I7,I8,I9]),
fd_labeling([A1,A2,A3,A4,A5,A6,A7,A8,A9,
B1,B2,B3,B4,B5,B6,B7,B8,B9,
C1,C2,C3,C4,C5,C6,C7,C8,C9,
D1,D2,D3,D4,D5,D6,D7,D8,D9,
E1,E2,E3,E4,E5,E6,E7,E8,E9,
F1,F2,F3,F4,F5,F6,F7,F8,F9,
G1,G2,G3,G4,G5,G6,G7,G8,G9,
H1,H2,H3,H4,H5,H6,H7,H8,H9,
I1,I2,I3,I4,I5,I6,I7,I8,I9]).
我应该写另一个脚本还是我可以更改这个脚本? 谢谢,
代码需要重写才能适用于一般情况。目前它在所有维度上都是 hard-coded,因此不能仅仅通过调整来概括它。
这是一个示例,向您展示如何使用 maplist
作为解决此类问题的工具。它不是您问题的完整解决方案,但应该可以帮助您入门。
% Auxiliary predicates that will be maplist-friendly (the list is the last argument)
%
length_(N, L) :- length(L, N).
fd_domain_(Min, Max, L) :- fd_domain(L, Min, Max).
constrained_matrix(N, Matrix) :-
length(Matrix, N), % Matrix has N elements
maplist(length_(N), Matrix), % Each element of Matrix has N elements
maplist(fd_domain_(1, N), Matrix), % The domain of each sublist is 1 to N
maplist(fd_all_different, Matrix), % Each sublist must have elements all different
maplist(fd_labeling, Matrix).
和运行这样的查询:
| ?- constrained_matrix(3, L).
L = [[1,2,3],[1,2,3],[1,2,3]] ? ;
L = [[1,2,3],[1,2,3],[1,3,2]] ? ;
L = [[1,2,3],[1,2,3],[2,1,3]] ? ;
L = [[1,2,3],[1,2,3],[2,3,1]] ? ;
...
如您所见,解决方案集是所有 3x3 矩阵,其中行具有唯一元素,但列可以是任何内容。您可以通过可以转置矩阵的 writing/using Prolog 谓词添加更多约束(在 Matrix
中交换行与列)并再次使用 maplist
来约束列。您可以根据需要为子方块添加更多约束(例如,编写一个谓词来提取子矩阵,并充分利用 maplist
)。