有没有人知道在Matlab中验证数独谜题的算法?对于矩阵S的输入是要检查的难题,如果拼图为真,则输出TF为1,如果为假,则为0,我写道:
TF=1
for i=1:9
if sum(S(i,:))~=45|sum(S(:,i))~=45|sum(sum(S(6*(floor(i/3)+1):6*(floor(i/3)+1)+3,6*(floor(i/3)+1):6*(floor(i/3)+1)+3)))~=45
TF=0
end
end
它的工作原理是假设任何行,列和9个3x3块的总和是45,但它很慢而且很笨重。有人可以帮我清理并简化它吗?
答案 0 :(得分:0)
从参考资料http://www.mathworks.com/matlabcentral/fileexchange/7676-sudoku
修改代码TF = 1;
if sum(sum(S))~=405
TF=0;
elseif S(1,1) == S(1,2)
TF=0;
else
for i=1:9
for j=1:9
if i<4 iii=[1 2 3]; end
if i>3 && i<7 iii=[4 5 6]; end
if i>6 iii=[7 8 9]; end
if j<4 jjj=[1 2 3]; end
if j>3 && j<7 jjj=[4 5 6]; end
if j>6 jjj=[7 8 9]; end
if sum(sum(S(iii,jjj)))~=45
TF=0;
break;
end
end
end
for i=1:9
if sum(S(i,:))~=45 | sum(S(:,i))~=45
TF=0;
break;
end
end
end
答案 1 :(得分:0)
这应该是检查数独的快速版本:
%% constants:
k=3;
l=k*k;
ix=reshape(1:l^2,l,l);
firstblock=reshape(ix(1:k,1:k),1,l);
blocks=ix(1:k:end,1:k:end);
% create a index matrix which selects: Row 1:9, Col 1:9, Block 1:9
selector=[ix;ix';bsxfun(@plus,firstblock,blocks(:)-1)];
valid=repmat([1:l],l*3,1);
%% check:
C=sort(S(selector),2);
okay=all(all(C==valid))
对于新的解决方案,只需重复check
- 部分,在我的电脑上低于0.0001秒。