kiralyno.py
1    import copy
2    
3    
4    def adatok_megadasa():
5        # Érvényes táblaméret kierőszakolása
6    
7        while True:
8            try:
9                meret = int(input('Mi legyen a tábla mérete? n = '))
10               if meret == 1:
11                   print('Hülyeség, legalább 4 legyen a méret! ')
12               if meret <= 3:
13                   print('Mondom >= 4 legyen!')
14                   continue
15               return meret
16           except ValueError:
17               print('Baromság! Szedd össze magad!')
18   
19   
20   def tabla_megadasa(meret):
21       # Előállítja az nxn-es táblát
22       tabla = [0] * meret
23       for i_sor in range(meret):
24           tabla[i_sor] = [0] * meret
25       return tabla
26   
27   
28   def print_megoldasok(megoldasok, meret):
29       # Megoldások kiírása
30       for megold in megoldasok:
31           for sor in megold:
32               print(sor)
33           print()
34   
35   
36   def jo_eset(tabla, sor, oszl, meret):
37       # sor,oszl pozíció vizsgálata
38   
39       # balra eső mezők az adott sorban
40       for i_oszl in range(oszl):
41           if tabla[sor][i_oszl] == 1:
42               return False
43   
44       # átlósan balra fel
45       i_sor, i_oszl = sor, oszl
46       while i_sor >= 0 and i_oszl >= 0:
47           if tabla[i_sor][i_oszl] == 1:
48               return False
49           i_sor -= 1
50           i_oszl -= 1
51   
52       # átlósan balra le
53       j_sor, j_oszl = sor, oszl
54       while j_sor < meret and j_oszl >= 0:
55           if tabla[j_sor][j_oszl] == 1:
56               return False
57           j_sor += 1
58           j_oszl -= 1
59   
60       return True
61   
62   
63   def megoldas(tabla, oszl, meret):
64       if oszl >= meret:
65           return
66   
67       for sor in range(meret):
68           if jo_eset(tabla, sor, oszl, meret):
69               tabla[sor][oszl] = 1
70               if oszl == meret - 1:
71                   hozzaad_megoldasokhoz(tabla)
72                   tabla[sor][oszl] = 0
73                   return
74               megoldas(tabla, oszl + 1, meret)
75               # backtrack
76               tabla[sor][oszl] = 0
77   
78   
79   def hozzaad_megoldasokhoz(tabla):
80       global megoldasok
81       mentett_tabla = copy.deepcopy(tabla)
82       megoldasok.append(mentett_tabla)
83   
84   
85   meret = adatok_megadasa()
86   tabla = tabla_megadasa(meret)
87   megoldasok = []
88   megoldas(tabla, 0, meret)
89   print_megoldasok(megoldasok, meret)
90   
91   print('Összes megoldás száma = {}'.format(len(megoldasok)))