<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<HTML><HEAD>
<META http-equiv=Content-Type content="text/html; charset=iso-8859-2">
<META content="MSHTML 6.00.2900.3199" name=GENERATOR>
<STYLE></STYLE>
</HEAD>
<BODY bgColor=#ffffff>
<DIV><FONT face=Arial size=2>Ahoj</FONT></DIV>
<DIV> </DIV>
<DIV><FONT face=Arial size=2>Pracuji na programu řešícím Sudoku. Udělal jsem
část programu, která postupuje podobně jako když to řeším já (zjištuje, to kde
která čísla být nesmí a podle toho doplní). Pokud ale tato část nebyla schopna
doplnit celou mřížku, musím ji doplnit jiným mechanismem.<BR>Zkusil jsem
naprogramovat mechanism na zkoušení všech možných variant. Postupně procházím
celým polem a pokud narazím na políčko, které bylo na začátku prázdné, zvětším
jeho hodnotu +1. Potom testuju zda upravné políčko "pasuje" do sudoku (jestli
není v řadě, čáře, čtverci 2x). Pokud pasuje, posunu se v poli dál, pokud ne
opakuje se celý cyklus kdy zvětšuju hodnotu políčka o jedno. Pokud hodnota
políčka překročí maximální povolenou hodnotu, vynuluju ho a vracím se zkoušet o
jedno políčko zpět.<BR>Takto vypadá algrotitmus:</FONT></DIV>
<DIV> </DIV><FONT face=Arial size=2>
<DIV><BR># -*- coding: cp1250 -*-<BR>import copy<BR>from math import sqrt<BR>def
vypis(co,sirka):<BR>
ctverec=int(sqrt(sirka))<BR> for x in
range(len(co)):<BR> if x % ctverec ==
0 and x !=
0:<BR> print
int(2.5*sirka)*"-","\n",<BR> for y in
range(len(co[x])):<BR>
if y % ctverec == 0 and y !=
0:<BR>
print "|",<BR>
print co[x][y],<BR> print ""<BR>class
SudokuDores:<BR> def
__init__(self):<BR>
pass<BR> def
find_vzad(self,pos):<BR>
pos=self.nuly.index(pos)-1<BR> if pos
< 0:return -1<BR>
pos=self.nuly[pos]<BR>
<BR> return pos<BR>
def pasuje(self, x,y,co):<BR>
<BR>
#hor:<BR> if co in
self.zadani[x]:<BR>
return False<BR>
s=[]<BR>
#ver<BR> for prvek in
self.zadani:<BR>
s.append(prvek[y])<BR> if co in
s:<BR> return
False<BR>
#rec<BR>
cx,cy=x/self.ctverec,y/self.ctverec<BR>
s=[]<BR> for x in
range((cx*self.ctverec+self.ctverec)-cx*self.ctverec):<BR>
for y in
range((cy*self.ctverec+self.ctverec)-cy*self.ctverec):<BR>
s.append(self.zadani[x][y])<BR>
s.sort()<BR> if co in s and
range(1,self.sirka+1) !=
s:<BR>
<BR>
<BR> return
False<BR> return
True<BR> def pocitej(self,
zadani):<BR>
self.zadani=zadani<BR>
self.kontrola=copy.deepcopy(self.zadani)<BR>
self.sirka=len(self.zadani[0])<BR>
self.ctverec =
int(sqrt(self.sirka))<BR>
self.nuly=[]<BR>
cislo=0<BR> for prvek in
self.zadani:<BR>
for x in
prvek:<BR>
if x ==
0:<BR>
self.nuly.append(cislo)<BR>
cislo=cislo+1<BR>
pos=0<BR> while pos >=
0:<BR>
<BR> if pos
>=
self.sirka**2-1:<BR>
print "Nalezeno
řešení:"<BR>
vypis(self.zadani,self.sirka)<BR>
break<BR>
<BR>
x=pos/self.sirka<BR>
y=pos%self.sirka<BR>
if self.kontrola[x][y] ==
0:<BR>
h=self.zadani[x][y]+1<BR>
if h >
self.sirka:<BR>
self.zadani[x][y] =
0<BR>
pos=self.find_vzad(pos)<BR>
else:<BR>
if
self.pasuje(x,y,h):<BR>
pos=pos+1<BR>
<BR>
self.zadani[x][y]=h<BR>
else:<BR>
pos=pos+1<BR> def je_ok(self,
seznam):<BR>
_=range(1,self.sirka+1)<BR>
s=[]<BR> for prvek in
seznam:<BR>
s.append(prvek)<BR> for prvek in
_:<BR> if
s.count(prvek) > 1 and prvek !=
0:<BR>
return False<BR> return
True<BR> def je_sudoku(self,
_zadani):<BR>
zadani=copy.deepcopy(_zadani)<BR> for
radek in zadani:<BR>
<BR> if not
self.je_ok(radek):<BR>
return False<BR>
zadani=copy.deepcopy(_zadani)
<BR> for x in
range(self.sirka):<BR>
s=[]<BR> for p
in
range(len(zadani)):<BR>
s.append(zadani[p][x])<BR>
if not
self.je_ok(s):<BR>
return False<BR> return
True
</DIV>
<DIV> </DIV>
<DIV><BR>if __name__ == "__main__":<BR>
zadani1=[<BR>[2,0,4,0,1,0,0,0,0],<BR>[6,1,5,0,0,0,0,0,4],<BR>[0,0,0,9,6,0,0,0,0],<BR>[3,0,7,0,0,1,0,0,0],<BR>[0,4,0,0,0,0,0,5,0],<BR>[0,0,0,4,0,0,9,0,3],<BR>[0,0,0,0,3,9,0,0,0],<BR>[1,0,0,0,0,0,6,2,0],<BR>[5,7,2,0,8,0,3,0,9],</DIV>
<DIV> </DIV>
<DIV> ]<BR>
zadani2=[<BR>[0,0,2,0],<BR>[2,0,1,4],<BR>[0,1,3,2],<BR>[0,0,0,0],<BR>
]<BR> r=SudokuDores()<BR>
r.pocitej(zadani2)</DIV>
<DIV> </DIV>
<DIV><BR>Pokud ho spustíte, spočítá správně sudoku o 4 sloupcích. Ale pokud mu
zadám "zadani1" nedojdu k žádnému výsledku.</DIV>
<DIV> </DIV>
<DIV>Kde je chyba? </DIV>
<DIV><BR>Děkuji</DIV>
<DIV> </DIV>
<DIV>Jakub 'Blujacker' Vojáček</FONT></DIV></BODY></HTML>