n = 3
mriezka = [[0 for _ in range(n)] for _ in range(n)]
def zobraz_mriezku(mriezka):
print('---', sum(sum(riadok) for riadok in mriezka))
for riadok in mriezka:
print(*riadok)
zobraz_mriezku(mriezka)
--- 20 5 5 5 5
def hodnota(x, y):
if 0 <= x < n and 0 <= y < n:
return mriezka[x][y]
return None
def cisla(indexy):
return [ hodnota(x, y) for x, y in indexy]
def over(r, s):
#overi ci hodnota [r][s] ma za susedov kazde mensie cislo
if r < 0:
return True
susedia = cisla([[r-1, s], [r+1, s], [r, s-1], [r, s+1]])
for cislo in range(1, mriezka[r][s]):
if not cislo in susedia:
return False
return True
def gen(riadok, stlpec):
if riadok == n:
for s in range(n):
if not over(riadok-1, s):
return
zobraz_mriezku(mriezka)
return
#overime ci policko riadok nad je ok
for hodnota in range(1, 6):
mriezka[riadok][stlpec] = hodnota
if over(riadok-1, stlpec):
if stlpec < n-1:
gen(riadok, stlpec+1)
else:
gen(riadok+1, 0)
n = 2
mriezka = [[0 for _ in range(n)] for _ in range(n)]
gen(0, 0)
--- 4 1 1 1 1 --- 5 1 1 1 2 --- 5 1 1 2 1 --- 6 1 1 2 2 --- 7 1 1 2 3 --- 7 1 1 3 2 --- 5 1 2 1 1 --- 6 1 2 1 2 --- 7 1 2 1 3 --- 6 1 2 2 1 --- 7 1 3 1 2 --- 5 2 1 1 1 --- 6 2 1 1 2 --- 6 2 1 2 1 --- 7 2 1 3 1 --- 6 2 2 1 1 --- 7 2 3 1 1 --- 7 3 1 2 1 --- 7 3 2 1 1
mriezka
[[1, 1, 1], [1, 4, 3], [3, 1, 1]]
r, s = 0, 0
set(cisla([[r-1, s], [r+1, s], [r, s-1], [r, s+1]]))
{1, None}
over(1,1)
False
mriezka[0][1] = 2
zobraz_mriezku(mriezka)
--- 1 2 1 1 4 3 3 1 1
over(1,1)
True
%%time
def hodnota(x, y):
if 0 <= x < n and 0 <= y < n:
return mriezka[x][y]
return None
def cisla(indexy):
return [ hodnota(x, y) for x, y in indexy]
def over(r, s):
#overi ci hodnota [r][s] ma za susedov kazde mensie cislo
susedia = cisla([[r-1, s], [r+1, s], [r, s-1], [r, s+1]])
for cislo in range(1, mriezka[r][s]):
if not cislo in susedia:
return False
return True
def zobraz_mriezku(mriezka):
global najviac
suma = sum(sum(riadok) for riadok in mriezka)
if suma > najviac:
print('---', suma)
for riadok in mriezka:
print(*riadok)
najviac = suma
def gen(riadok, stlpec):
if riadok == n:
for s in range(n):
if not over(riadok-1, s):
return
zobraz_mriezku(mriezka)
return
#overime ci policko riadok nad je ok
for hodnota in range(5, 0, -1):
mriezka[riadok][stlpec] = hodnota
if over(riadok-1, stlpec):
if stlpec < n-1:
gen(riadok, stlpec+1)
else:
gen(riadok+1, 0)
n = 3
najviac = 0
mriezka = [[0 for _ in range(n)] for _ in range(n)]
gen(0, 0)
--- 19 3 2 3 1 1 1 3 2 3 --- 20 2 4 1 1 3 2 2 4 1 CPU times: total: 188 ms Wall time: 177 ms
5**(25) //10**10/3600
8278.422777777778
5**(2*8) //10**10 [15s pre n = 8, ak kombinacie dvoch riadkov]
15
5**8
390625
Nájdené súčty:
3
--- 20
2 4 1
1 3 2
2 4 1
5
--- 60
3 2 4 3 2
1 1 1 1 1
3 5 2 5 3
2 4 1 4 2
1 3 2 3 1
8
--- 151
3 2 4 3 2 4 3 2
1 1 1 1 1 1 1 1
4 3 5 4 3 5 4 3
2 2 2 2 2 2 2 2
1 1 1 1 1 1 1 1
4 3 5 2 5 3 5 2
2 2 4 1 4 2 4 1
1 1 3 2 3 1 3 2