# HG changeset patch # User Laman # Date 2017-10-16 22:16:03 # Node ID e79c5818edfd7e47165020e59c86817497510877 # Parent 86543e726ef8521d0cb0f73bf26e577d71c67381 algoritmus X diff --git a/dlx.py b/dlx.py new file mode 100644 --- /dev/null +++ b/dlx.py @@ -0,0 +1,96 @@ +# based god Donald Knuth +# http://www-cs-faculty.stanford.edu/~uno/papers/dancing-color.ps.gz +# sám bych to asi nevymyslel + + +class Cell: + def __init__(self,left=None,right=None,up=None,down=None,col=None): + self.left=left + self.right=right + self.up=up + self.down=down + self.col=col + + +class Column(Cell): + def __init__(self,name,*args,**kwargs): + super().__init__(*args,**kwargs) + self.name=name + self.size=0 + + def cover(self): + self.right.left=self.left + self.left.right=self.right + r=self.down + while r is not self: + c=r.right + while c is not r: + c.down.up=c.up + c.up.down=c.down + c.col.size-=1 + c=c.right + r=r.down + + def uncover(self): + r=self.up + while r is not self: + c=r.left + while c is not r: + c.col.size+=1 + c.down.up=c + c.up.down=c + c=c.left + r=r.up + self.right.left=self + self.left.right=self + + +class Header: + def __init__(self,left=None,right=None): + self.left=left + self.right=right + self._res=[] + + def search(self,k=0): + if self.right is self: + self.print() + return True + if len(self._res)<=k: + self._res.append(None) + + col=self.chooseCol() + col.cover() + row=col.down + while row is not col: + row=row.down + self._res[k]=row + c=row.right + while c is not row: + c.col.cover() + self.search(k+1) + c=row.right + c=row.left + while c is not row: + c.col.uncover() + c=c.left + col.uncover() + + def chooseCol(self): + c=self.right + best=c.size + res=c + while c is not self: + if c.size