<!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>