function Y = SudokuFast(X) %wurde erstellt von Matthias Lalk X1=[2 2 2 2 2 2 2 2 2;2 2 2 2 2 2 2 2 2;2 2 2 2 2 2 2 2 2;2 2 2 2 2 2 2 2 2;2 2 2 2 2 2 2 2 2;2 2 2 2 2 2 2 2 2;2 2 2 2 2 2 2 2 2;2 2 2 2 2 2 2 2 2;2 2 2 2 2 2 2 2 2]; Array=struct('X1',X1,'X2',X1,'X3',X1,'X4',X1,'X5',X1,'X6',X1,'X7',X1,'X8',X1,'X9',X1); % 9 Matrizen (für jede Zahl eine) werden erzeugt. 0: heißt diese Zahl steht da sicher nicht, weil extrahiert durch eine 1: Zahl steht da sicher; 2: Zahl steht da eventuell=> überall zweier. 3: Zahl steht da sicher nicht, weil dort eine andere Zahl steht. for xx = 1:9 for yy = 1:9 X(xx,yy); switch X(xx,yy) case 1 Andern(1,xx,yy) case 2 Andern(2,xx,yy) case 3 Andern(3,xx,yy) case 4 Andern(4,xx,yy) case 5 Andern(5,xx,yy) case 6 Andern(6,xx,yy) case 7 Andern(7,xx,yy) case 8 Andern(8,xx,yy) case 9 Andern(9,xx,yy) otherwise end end end Loesen() function Loesen() w=1; while w>0 t=1; while t>0 t=0; for Zahl = 1:9%so viele Durchgänge, bis ein Durchgang durch alle neun Matrizen geschieht, ohne, dass sich was verändert. t=t+Finden(Zahl); end end w=Ausschluss; end Ergebnis end function Ergebnis d=0; K=zeros(9); for rr = 1:9 for uu = 1:9 for j = 1:9 d=strcat('Array.X',num2str(j),'(rr,uu)'); d=eval(d); if(d==1) K(rr,uu)=j; end end end end Y=Sudokuprob(K); end function t=Finden(Zahl) t=0; H=strcat('Array.X',num2str(Zahl)); %Aktualisiern H=eval(H); for rr = 1:9 %Zeilen auf sichere Ergebnisse durchsuchen if(2==sum(H(rr,1:9))) for uu = 1:9 if(H(rr, uu)==2) Andern(Zahl, rr, uu); t=1; break; end end end end if (t==1) H=strcat('Array.X',num2str(Zahl)); %Aktualisiern H=eval(H); end for rr = 1:9 %Spalten auf sichere Ergebnisse durchsuchen if(2==sum(H(1:9,rr))) for uu = 1:9 if(H(uu, rr)==2) Andern(Zahl, uu, rr); t=2; break; end end end end if (t==2) H=strcat('Array.X',num2str(Zahl)); %Aktualisiern H=eval(H); end for ii = 1:3:7 for jj = 1:3:7 W=[H(ii,jj:jj+2) H(ii+1,jj:jj+2) H(ii+2,jj:jj+2)]; W; if(2==sum(W)) [a,b]=find(H(ii:ii+2,jj:jj+2)==2); a=a+ii-1; b=b+jj-1; Andern(Zahl, a, b); t=3; break; %aufsummieren, ob es nur eine 2 gibt; danach Position 2 ermitteln und Andern aufrufen end if (t==3) H=strcat('Array.X',num2str(Zahl)); %Aktualisiern H=eval(H); t=4; end end end end function v=Ausschluss() d=0; v=0; for rr = 1:9 for uu = 1:9 p=0; for j = 1:9 d=strcat('Array.X',num2str(j),'(rr,uu)');%gibt es ein leeres Feld in der Matrix, wo nur in einer der neun Matrizen eine eins steht, so ist dieses Feld damit eindeutig. d=eval(d); if(d==2) l=[j rr uu]; p=p+d; if (p>2) break; end end end if (p==2) Andern (l(1),l(2),l(3)); v=1; end end end end function Andern(Zahl,Zeile,Spalte) %Löschen aller Zahlen die nicht Null sind. Z=strcat('Array.X',num2str(Zahl)); Z=eval(Z); Z(Zeile,:)=0; Z(:,Spalte)=0; if (Zeile<4) if (Spalte<4) for aa = 1:3 for bb = 1:3 Z(aa,bb)=0; end; end; elseif (3 zurück gehen x=1; B(aa,bb)=0; bb=bb-1; if(bb==0) bb=9; aa=aa-1; end end end else %wenn keine Null dasteht => Ursprungsmatrix war schon besetzt, oder aber es ging zurück if (x==0) % Forwärts bb=bb+1; if (bb==10) bb=1; aa=aa+1; end else % Rückwärts if (A(aa,bb)~=0) % Ursprungsmatrix ist hier schon besteht => weiter zurück bb=bb-1; if(bb==0) bb=9; aa=aa-1; end else % Ursprungswert noch nicht vorhanden if(B(aa,bb)==9) % Sonderfall 9 steht schon im Kästchen => noch eins weiter zurück & 9 löschen B(aa,bb)=0; bb=bb-1; if(bb==0) bb=9; aa=aa-1; end else y=B(aa,bb)+1; B(aa,bb)=0; end end end end end B; function [erf] = Pruefen(B,aa,bb,n) erf=0; for z = 1:9 if (B(z,bb) == n) return end end for zz = 1:9 if (B(aa,zz) == n) return end end xx=bb; yy=aa; while (mod((xx-1),3) ~= 0) xx = xx - 1; end q=xx; while (mod((yy-1),3) ~= 0) yy = yy - 1; end for yy= yy:(yy+2) for xx = xx:(xx+2); if (B(yy, xx) == n) return end end xx=q; end erf = 1; end end end