验证数独谜题的算法?

时间:2013-11-22 18:58:38

标签: matlab

有没有人知道在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,但它很慢而且很笨重。有人可以帮我清理并简化它吗?

2 个答案:

答案 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秒。