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