function SudokuFast(EingabeMatrix) MinAnzahlBackup = zeros(1,9); SudokuFelder = cell(9,9); SudokuLsg = cell(9,9); SudokuBackup = cell(9,9); SudokuUrbild = cell(9,9); for (i1 = 1:1:9) for (i2 = 1:1:9) if (EingabeMatrix(i1,i2) == 0) SudokuFelder{i1,i2} = ones(1,9); else SudokuFelder{i1,i2} = zeros(1,9); SudokuFelder{i1,i2}(1,EingabeMatrix(i1,i2)) = 1; end SudokuLsg{i1,i2} = ones(1,9); SudokuBackup{i1,i2} = zeros(1,9); end end Entscheidung = 0; while(Entscheidung == 0) for (i1 = 1:1:9) for (i2 = 1:1:9) if (sum(SudokuFelder{i1,i2}) == 1) for (i3 = 1:1:9) if (i3 == i2) SudokuLsg{i1,i3} = SudokuFelder{i1,i2}; else SudokuLsg{i1,i3} = SudokuLsg{i1,i3} - SudokuFelder{i1,i2}; end if (i3 == i1) SudokuLsg{i3,i2} = SudokuFelder{i1,i2}; else SudokuLsg{i3,i2} = SudokuLsg{i3,i2} - SudokuFelder{i1,i2}; end end ZeilenZahl = (ceil(i1/3) - 1)*3; SpaltenZahl = (ceil(i2/3) - 1)*3; for (i4 = 1:1:3) for (i5 = 1:1:3) if (ZeilenZahl + i4 == i1 && SpaltenZahl + i5 == i2) SudokuLsg{ZeilenZahl + i4,SpaltenZahl + i5} = SudokuFelder{i1,i2}; else SudokuLsg{ZeilenZahl + i4,SpaltenZahl + i5} = SudokuLsg{ZeilenZahl + i4,SpaltenZahl + i5} - SudokuFelder{i1,i2}; end end end end end end for (i1 = 1:1:9) for (i2 = 1:1:9) for (i3 = 1:1:9) if(SudokuLsg{i1,i2}(1,i3) < 0) SudokuLsg{i1,i2}(1,i3) = 0; end end end end for (i1 = 1:1:9) LZeile = 0; LSpalte = 0; for (i2 = 1:1:9) LZeile = LZeile + SudokuLsg{i1,i2}; LSpalte = LSpalte + SudokuLsg{i2,i1}; end for (i3 = 1:1:9) if (LZeile(1,i3) == 1) for (i4 = 1:1:9) if (SudokuLsg{i1,i4}(1,i3) == 1) SudokuLsg{i1,i4} = zeros(1,9); SudokuLsg{i1,i4}(1,i3) = 1; end end end if (LSpalte(1,i3) == 1) for (i5 = 1:1:9) if (SudokuLsg{i5,i1}(1,i3) == 1) SudokuLsg{i5,i1} = zeros(1,9); SudokuLsg{i5,i1}(1,i3) = 1; end end end end end for (i1 = 1:1:3) VertikalesQuadrat = (i1 - 1)*3; for (i2 = 1:1:3) HorizontalesQuadrat = (i2 - 1)*3; LQuadrat = 0; for (i3 = 1:1:3) for (i4 = 1:1:3) LQuadrat = LQuadrat + SudokuLsg{VertikalesQuadrat + i3,HorizontalesQuadrat + i4}; end end for (i5 = 1:1:9) if (LQuadrat(1,i5) == 1) for (i6 = 1:1:3) for (i7 = 1:1:3) if (SudokuLsg{VertikalesQuadrat + i6,HorizontalesQuadrat + i7}(1,i5) == 1) SudokuLsg{VertikalesQuadrat + i6,HorizontalesQuadrat + i7} = zeros(1,9); SudokuLsg{VertikalesQuadrat + i6,HorizontalesQuadrat + i7}(1,i5) = 1; end end end end end LQuadratAktualisiert = 0; for (i8 = 1:1:3) for (i9 = 1:1:3) LQuadratAktualisiert = LQuadratAktualisiert + SudokuLsg{VertikalesQuadrat + i8,HorizontalesQuadrat + i9}; end end for (i10 = 1:1:3) LQuadSumZeile = 0; LQuadSumSpalte = 0; for(i11 = 1:1:3) LQuadSumZeile = LQuadSumZeile + SudokuLsg{VertikalesQuadrat + i10,HorizontalesQuadrat + i11}; LQuadSumSpalte = LQuadSumSpalte + SudokuLsg{VertikalesQuadrat + i11, HorizontalesQuadrat + i10}; end DiffZeile = LQuadratAktualisiert - LQuadSumZeile; DiffSpalte = LQuadratAktualisiert - LQuadSumSpalte; for (i12 = 1:1:9) if (DiffZeile(1,i12) == 0) for (i13 = 1:1:9) if ((ceil(i13/3) - 1)*3 == HorizontalesQuadrat) else SudokuLsg{VertikalesQuadrat + i10,i13}(1,i12) = 0; end end end if (DiffSpalte(1,i12) == 0) for (i14 = 1:1:9) if ((ceil(i14/3)-1)*3 == VertikalesQuadrat) else SudokuLsg{i14,HorizontalesQuadrat + i10}(1,i12) = 0; end end end end end end end Counter = 0; for (i1 = 1:1:9) for (i2 = 1:1:9) if (sum(SudokuFelder{i1,i2} == SudokuLsg{i1,i2}) == 9) Counter = Counter + 1; end end end if (Counter == 9*9) n1 = 0; for (i1 = 1:1:9) for (i2 = 1:1:9) n1 = n1 + sum(SudokuBackup{i1,i2}); end end if (n1 == 0) n2 = 0; for (i1 = 1:1:9) for (i2 = 1:1:9) n2 = n2 + sum(SudokuUrbild{i1,i2}); end end if(n2 == 0) for (i1 = 1:1:9) for (i2 = 1:1:9) SudokuUrbild{i1,i2} = SudokuLsg{i1,i2}; KAnz = sum(SudokuUrbild{i1,i2}); MinAnzahlBackup(1,KAnz) = MinAnzahlBackup(1,KAnz) + 1; end end end Counter1 = 1; while (Counter1 <= 9) if (MinAnzahlBackup(1,Counter1) ~= 0) MinAnzahlBackup(1,Counter1) = 0; %Counter1 = DimMatrix; Counter1 = 9; end Counter1 = Counter1 + 1; end Counter2 = 1; Zeiger = 0; while (Counter2 <= 9) if (MinAnzahlBackup(1,Counter2) ~= 0) Zeiger = Counter2; Counter2 = 9; end Counter2 = Counter2 + 1; end if (Zeiger == 0) Entscheidung = 2; end for (i3 = 1:1:9) for (i4 = 1:1:9) if (sum(SudokuUrbild{i3,i4}) == Zeiger) SudokuBackup{i3,i4} = SudokuUrbild{i3,i4}; end end end end for (i1 = 1:1:9) for (i2 = 1:1:9) SudokuLsg{i1,i2} = SudokuUrbild{i1,i2}; end end Counter1 = 1; while (Counter1 <= 9) Counter2 = 1; while (Counter2 <= 9) Counter3 = 1; if (sum(SudokuBackup{Counter1,Counter2}) ~= 0) while (Counter3 <= 9) if (SudokuBackup{Counter1,Counter2}(1,Counter3) == 1) SudokuLsg{Counter1,Counter2} = zeros(1,9); SudokuLsg{Counter1,Counter2}(1,Counter3) = 1; SudokuBackup{Counter1,Counter2}(1,Counter3) = 0; Counter3 = 9; Counter2 = 9; Counter1 = 9; end Counter3 = Counter3 + 1; end end Counter2 = Counter2 + 1; end Counter1 = Counter1 + 1; end end for (i1 = 1:1:9) for (i2 = 1:1:9) SudokuFelder{i1,i2} = SudokuLsg{i1,i2}; end end x = 0; for (i1 = 1:1:9) for (i2 = 1:1:9) x = x + SudokuLsg{i1,i2}; end end if (sum(x) == 9*9) Entscheidung = 1; end end for (i1 = 1:1:9) for (i2 = 1:1:9) Erg = 0; if (sum(SudokuLsg{i1,i2}) == 1) for (i3 = 1:1:9) Erg = Erg + SudokuLsg{i1,i2}(1,i3)*i3; end end B(i1,i2) = Erg; end end if (Entscheidung == 2) disp('Das eingegebene Sudoku ist nicht eindeutig lösbar.') else disp(B); end end