Sunteți pe pagina 1din 4

Gutulescu Daniel-Marius

ET 31

Rezolvarea unui Sudoku folosind mathlab

Originea Sudoku
Majoritatea oamenilor presupun că Sudoku a provenit din Japonia. De fapt, este o
invenție americană. A apărut prima dată, cu numele Number Place, în revista Dell
Puzzle în 1979. În 1984, un editor japonez, Nikoli, a luat puzzle-ul în Japonia și ia dat
numele Sudoku, care este un acronim kanji pentru "numerele ar trebui să fie unice,
necăsătorită ". Times of London a început să publice puzzle-ul în 2004, și nu cu mult
timp înainte de a se răspândi în SUA și în întreaga lume.

Algoritmul de rezolvare a sudoku-urilor


Programul nostru MATLAB implică doar patru etape:
1. Completați toate singleturile.
2. Ieșiți dacă o celulă nu are candidați.
3. Completați o valoare experimentală pentru o celulă goală.
4. Apelați programul recursiv.

Funcția internă cheie este candidates . Fiecare celula goala incepe cu z = 1:9 si
foloseste valorile numerice in randul, coloana si blocul asociat elementelor zero
din z . Unelzii care rămân sunt candidații. De exemplu, ia în considerare celula (1,1) din
Figura 1. Începem cu

z = 1 2 3 4 5 6 7 8 9

Valorile din primul rând se modifică z la

z = 1 0 0 0 5 6 7 8 9
Apoi prima coloană se schimbă de la

z = 1 0 0 0 5 0 7 0 9

Blocul (1,1) nu face alte modificări, deci candidații pentru această celulă sunt

C {1,1} = [1 5 7 9]

Un puzzle dificil
Puzzle-ul prezentat în figura 1 este de fapt foarte dificil de rezolvat, fie manual, fie prin
calculator. Figurile 11 și 12 sunt instantanee ale calculului. Inițial, nu există singleturi,
deci primul pas recursiv se întâmplă imediat. Încercăm un "1" în celula (1,1). Figura 11
arată modul în care prima coloană este apoi completă cu pasul 22. Dar suntem încă
departe de soluție. După 3114 pași, recursiunea pune un "5" în celula (1,1), iar după
8172 de pași, încearcă o "7."

Figura 11. Valorile colorate cian sunt alegerile tentative făcute de backtracking, iar
valorile verde colorate sunt singleturile implicate de acele alegeri. "1" este alegerea
greșită pentru celula (1,1)
Figura 12. După 14.781 de pași, se pare că suntem aproape de o soluție, dar este
imposibil să continuăm pentru că nu există candidați pentru celulă (1,9). "7" este
alegerea greșită pentru celula (1,1).

Figura 12 prezintă situația după 14.781 de pași. Se pare că suntem aproape de o


soluție deoarece 73 dintre cele 81 de celule au fost atribuite valori. Dar primul rând și
ultima coloană, luate împreună, conțin toate cifrele de la 1 la 9, astfel încât nu există
valori pentru celula (1,9) din colțul din dreapta sus. Lista de candidați pentru această
celulă este goală și recursul se termină. În cele din urmă, după 19.229 de pași,
încercăm o "9" în prima celulă. Această "9" este o idee bună, deoarece mai puțin de
200 de pași mai târziu, după 19.422 pași, programul ajunge la soluția prezentată în
Figura 2. Aceasta este mult mai mult decât majoritatea puzzle-urilor.
Rezolvarea Sudoku folosind Backtracking recursive
funcție X = sudoku (X)
% SUDOKU Rezolvați Sudoku folosind backtracking recursive.
% sudoku (X), se așteaptă ca o matrice X de 9 pe 9.
% Completați toate "singletons".
% C este o matrice de celule de vectori candidate pentru fiecare celulă.
% s este prima celulă, dacă există, cu un singur candidat.
% e este prima celulă, dacă nu, fără candidați.
[C, s, e] = candidați (X);
în timp ce ~ isempty (s) && isempty (e)
X (s) = C {s};
[C, s, e] = candidați (X);
Sfârșit
% Return pentru puzzle-uri imposibile.
dacă este (e)
întoarcere
Sfârșit
% Recursion backtracking.
dacă există (X (:) == 0)
Y = X;
z = găsi (X (:) == 0,1); % Prima celulă nealimentată.
pentru r = [C {z}]% Iterați peste candidați.
X = Y;
X (z) = r; % Introduceți o valoare experimentală.
X = sudoku (X); % Apel recursiv.
dacă toate (X (:)> 0)% S-a găsit o soluție.
întoarcere
Sfârșit
Sfârșit
Sfârșit
% ------------------------------
funcție [C, s, e] = candidați (X)
C = celula (9,9);
tri = (k) 3 * plafoane (k / 3-1) + (1: 3);
pentru j = 1: 9
pentru i = 1: 9
dacă X (i, j) == 0
z = 1: 9;
z (nenulosi (X (i, :))) = 0;
z (nenulosi (X (:, j))) = 0;
z (nenulosi (X (tri (i), tri (j)))) = 0;
C {i, j} = nenulosi (z) ';
Sfârșit
Sfârșit
Sfârșit
L = cellfun (@ lungime, C); % Număr de candidați.
s = găsiți (X == 0 & L == 1,1);
e = găsi (X == 0 & L == 0,1);
candidați finali%
end sudoku

S-ar putea să vă placă și