2013-11-22 4 views
0

Кто-нибудь знает алгоритм проверки головоломки судоку в Matlab? Для ввода матрицы S является головоломкой для проверки НФА выхода TF равен 1, если загадка истинно и 0, если ложно, я написал:Алгоритм проверки головоломки Sudoku?

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

Пожалуйста, начните с правильного отступа (выберите код в редакторе Matlab и нажмите «CTRL + I') и оберните строку (используя« ... »). Я не буду смотреть, прежде чем ты это сделаешь. –

+1

Ваш код не работает (из-за бесполезной индексации) и не проверяет все требования судоку: 5 * (9,9) также будут иметь 45 сумм для всех столбцов, строк и подблоков ... – matheburg

ответ

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 
+0

'vals' отсутствует , – Daniel

+0

@ Daniel R, обновлено, спасибо! – lennon310

+0

Решение принимает '5 * (9,9)' – Daniel

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.0001s на моем компьютере.

Смежные вопросы