2016-01-04 188 views
0

的大小我有一個腳本來解決數獨,大小= 9 * 9 我有81個變量,我定義的規則對他們來說,我怎樣才能改變數獨

如何更改此代碼來解決數獨與任何大小?例如對於數獨16 * 16,規則將針對4 * 4的子方案。

go(L) :- 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),

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]). 

要我寫的腳本或只是我可以改變這個嗎? 謝謝,

+1

你想如何處理任意大小的數獨中的子廣場?你的例子是9x9的3x3子廣場。如果用戶要求7x7數獨呢?或者你打算將尺寸限制在某些倍數的東西上? – lurker

+0

我編輯了我的問題並添加了更多解釋,對不起,如果我的問題不清楚 – parik

+0

謝謝,那太好了。我提供的答案仍然適用。您可以添加一些代碼,從總維度中確定子平面維度。 – lurker

回答

2

該代碼將需要重寫工作的一般情況下。它目前對於所有維度都是完全硬編碼的,所以不能僅僅對它進行調整。

下面是一個示例,向您展示如何使用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]] ? ; 
... 

正如你所看到的,解集是它具有獨特的元素行中的所有3×3的矩陣,但列可以是任何東西。您可以通過編寫/使用可轉置矩陣的Prolog謂詞(在Matrix中交換行與列)並再次使用maplist約束列來添加更多約束。您可以根據需要爲子區域添加更多的約束(例如,編寫謂詞以提取子矩陣,並使用maplist)。