Files
@ c4cd607ea28c
Branch filter:
Location: Tetris/dlx.py - annotation
c4cd607ea28c
1.8 KiB
text/x-python
skutečné dílky
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 | e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd 7a1226ab980e 7a1226ab980e 7a1226ab980e 7a1226ab980e 7a1226ab980e e79c5818edfd e79c5818edfd 7a1226ab980e 7a1226ab980e 7a1226ab980e 7a1226ab980e 7a1226ab980e 7a1226ab980e 7a1226ab980e 7a1226ab980e 7a1226ab980e 7a1226ab980e 7a1226ab980e 7a1226ab980e 7a1226ab980e e79c5818edfd e79c5818edfd 7a1226ab980e 7a1226ab980e e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd b55ea037fd35 b55ea037fd35 b55ea037fd35 7a1226ab980e e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd 7a1226ab980e 7a1226ab980e e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd 7a1226ab980e e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd 7a1226ab980e e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd e79c5818edfd | # 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,col):
self.left=self
self.right=self
self.up=self
self.down=self
self.col=col
def attachRight(self,c):
"""...-(b)-(self)-> <-(c)-(d)-..."""
self.right.left=c.left
c.left.right=self.right
self.right=c
c.left=self
def attachDown(self,c):
self.down.up=c.up
c.up.down=self.down
self.down=c
c.up=self
class Column(Cell):
def __init__(self,name):
super().__init__(self)
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(Column):
def __init__(self):
super().__init__("head")
self.up=self.down=self.size=None
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:
self._res[k]=row
c=row.right
while c is not row:
c.col.cover()
c=c.right
self.search(k+1)
c=row.left
while c is not row:
c.col.uncover()
c=c.left
row=row.down
col.uncover()
def chooseCol(self):
c=self.right
best=c.size
res=c
while c is not self:
if c.size<best:
best=c.size
res=c
c=c.right
return res
def print(self):
for r in self._res:
print(r.col.name,end=" ")
c=r.right
while c is not r:
print(c.col.name,end=" ")
c=c.right
print()
print()
|