資源簡介
用Matlab的整數規劃函數求解數獨,程序只有20行。
代碼片段和文件信息
%?初速狀態,0表示沒填的格子
S?=?[?740080016
??900035004
??000700000
??070009500
??610050087
??002600040
??000004000
??300560002
??560010039];
%?定義0、1數組?A(i?j?k)?=?1,如果方格(i?j)里的數為k;否則為0。
%?sudoku問題即求一定假設條件下的解。
p?=?3;
A?=?binvar(p^2p^2p^2‘full‘);
%?以下為限制條件
F?=?[sum(A1)?==?1];?%?限制每行每個數恰好一個
F?=?[F?sum(A2)?==?1];?%?限制每列每個數恰好一個
F?=?[F?sum(A3)?==?1];?%?限制每個單元格子里恰好一個數
for?m?=?1:p
????for?n?=?1:p
????????for?k?=?1:p^2
????????????s?=?sum(sum(A((m-1)*p+(1:p)(n-1)*p+(1:p)k)));??
????????????F?=?[F?s?==?1];??%?限制每個3×3的方框里每個數恰好出現一次
????????end
????end
end
for?i?=?1:p^2
????for?j?=?1:p^2
????????if?S(ij)
????????????F?=?[F?A(ijS(ij))?==?1];?%?初始給定的數要一直
????????end
????end
end
%?直接求解
sol?=?solvesdp(F);?
Z?=?0;
for?i?=?1:p^2
??????Z?=?Z??+?i*double(A(::i));?%?簡單相加即可
end
Z?%?輸出結果
評論
共有 條評論