sudoku.py
1    # N*N-es mátrix
2    # N=9
3    
4    # Sudoku "tábla" kiírása
5    def kiir(matrix):
6        for i in range(N):
7            for j in range(N):
8                print(matrix[i][j],end=' ')
9            print()
10   
11   # Annak vizsgálata, hogy az adott szám beilleszthető-e az adott
12   # sor-oszlop helyre
13   def Rendben(sudoku, sor, oszlop, szam):
14       # Ellenőrizzük, hogy az adott sorban szerepel-e már a beírni kívánt szám
15       # Ez esetben hamis értéket adunk vissza - return false
16       for o in range(N):
17           if sudoku[sor][o] == szam:
18               return False
19   
20       # Ellenőrizzük, hogy az adott oszlopban szerepel-e már a beírni kívánt
21       # szám. Ez esetben is hamis értéket adunk vissza - return false
22       for s in range(N):
23           if sudoku[s][oszlop] == szam:
24               return False
25   
26       # Megnézzük, hogy az érintett 3x3-as résztáblában szerepel-e már
27       # a beírni kívánt szám. Ez esetben is hamis értéket adunk vissza
28       # - return false
29       rt_sor = sor - sor % 3           # Résztábla kezdősorának meghatározása
30       rt_oszlop = oszlop - oszlop % 3  # Résztábla kezdőoszlopának meghatározása
31   
32       for i in range(rt_sor,rt_sor+3):
33           for j in range(rt_oszlop,rt_oszlop+3):
34               if sudoku[i][j] == szam:
35                   return False
36   
37       return True   # Ha minden rendben volt, igaz értéket adunk vissza
38   
39   # A részlegesen már kitöltött sudoku-tábla teljes kitöltése
40   def Sudoku_feltoltes(sudoku, sor, oszlop):
41   
42       # Ha a sornak és oszlopoknak is a végére értünk leállítjuk a rekurziót - return true
43       if sor == N - 1 and oszlop == N:
44           return True
45   
46       # Ha egy sor elemeivel (oszlopok) végeztünk, menjünk a következő sorra,
47       # oszlopot pedig megint az elejére állítjuk */
48       if oszlop == N:
49           sor+=1
50           oszlop = 0
51   
52       # Ellenőrizzük, hogy már kitöltött pozíción vagyunk-e,
53       # ha igen, menjünk egy oszloppal jobbra és rekurzió...
54       if sudoku[sor][oszlop] > 0:
55           return Sudoku_feltoltes(sudoku, sor, oszlop + 1)
56   
57       for szam in range(1,N+1):
58           # Elhelyezhető-e az adott szám az adott sor-oszlop pozíción
59           if Rendben(sudoku, sor, oszlop, szam):
60               sudoku[sor][oszlop] = szam
61               # Térjünk rá a következő oszlop vizsgálatára - rekurzió
62               if Sudoku_feltoltes(sudoku, sor, oszlop + 1):
63                   return True
64           # Ha nem találtunk megoldást, állítsuk ismét üresre az adott
65           # helyet a táblában
66           sudoku[sor][oszlop] = 0
67       return False
68   
69   # ************************** F Ő M O D U L ***********************
70   
71   # Kezdeti állapot megadása
72   N=9
73   sudoku = [
74              [ 5, 0, 0, 0, 4, 0, 7, 0, 3 ],
75   	        [ 0, 4, 0, 6, 2, 8, 0, 0, 0 ],
76   	        [ 0, 0, 2, 0, 0, 0, 0, 0, 0 ],
77   	        [ 0, 0, 0, 5, 0, 0, 4, 9, 7 ],
78   	        [ 0, 0, 0, 0, 7, 0, 0, 0, 0 ],
79   	        [ 7, 1, 4, 0, 0, 3, 0, 0, 0 ],
80   	        [ 0, 0, 0, 0, 0, 0, 6, 0, 0 ],
81   	        [ 0, 0, 0, 9, 6, 2, 0, 5, 0 ],
82   	        [ 8, 0, 1, 0, 3, 0, 0, 0, 9 ]
83           ]
84   
85   if Sudoku_feltoltes(sudoku, 0, 0):
86       kiir(sudoku)
87   else:
88       print('Nem találtam megoldást... ')
89   
90