class Grid: def __init__(self, width, height): self.height = height self.width = width self.grid = [] for i in range(width): self.grid.append([]) for j in range(height): self.grid[i].append(False) def totalSquares(self): return self.width * self.height def firstUnoccupiedSpace(self): for j in range(self.height): for i in range(self.width): if not self.occupied(i, j): return (i, j) def occupy(self, i, j): if self.occupied(i,j): return False else: self.grid[i][j] = True return True def occupied(self, i, j): if i < 0 or j < 0: return True elif i >= self.width or j >= self.height: return True else: return self.grid[i][j] def clone(self): grid = Grid(self.width, self.height) for i in range(self.width): for j in range(self.height): if self.occupied(i,j): grid.occupy(i,j) return grid def tile(self, tile, previousPlacements): if(len(previousPlacements) >= self.totalSquares() / len(tile)): print(drawTiling(self.width,self.height,previousPlacements)) return [previousPlacements, ] tilings = [] (i, j) = self.firstUnoccupiedSpace() for mirror in range(1): mirroredTile = tile if mirror else flipTile(tile) for rotation in range(4): rotatedTile = rotateTile(mirroredTile,rotation) for location in rotatedTile: center = (i - location[0],j - location[1]) g = self.clone() available = True for place in rotatedTile: if not g.occupy(center[0] + place[0],center[1] + place[1]): available = False break if available: tilings.extend(g.tile(tile, previousPlacements + [[(place[0] + center[0],place[1] + center[1]) for place in rotatedTile],])) return tilings def __str__(self): out = "" for j in range(self.width + 2): out+="-" out+="\n" for j in range(self.height): out+="|" for i in range(self.width): out += "x" if self.occupied(i,j) else " " out+="|\n" for j in range(self.width + 2): out+="-" return out def rotateTile(tile, times): if times % 2: return [((-1) ** (times // 2) * j,(-1) ** (times // 2 + 1) * i) for (i,j) in tile] else: return [((-1) ** (times // 2) * i,(-1) ** (times // 2) * j) for (i,j) in tile] def flipTile(tile): return [(-i,j) for (i,j) in tile] def drawTiling(width, height, tiling): tileDict = {} for tile in range(len(tiling)): for location in tiling[tile]: tileDict[location] = tile output = u'\u250C' for i in range(width - 1): if tileDict[(i,0)] == tileDict[(i + 1,0)]: output+=u'\u2500' else: output+=u'\u252C' output+=u'\u2510\n' for j in range(height - 1): if tileDict[(0,j)] == tileDict[(0,j + 1)]: output+=u'\u2502' else: output+=u'\u251C' for i in range(width - 1): if tileDict[(i,j)] == tileDict[(i + 1,j)]: if tileDict[(i,j + 1)] == tileDict[(i + 1,j + 1)]: if tileDict[(i,j)] == tileDict[(i,j + 1)]: output +=" " else: output +=u'\u2500' else: if tileDict[(i,j)] == tileDict[(i,j + 1)]: output +=u'\u250C' else: if tileDict[(i + 1,j)] == tileDict[(i + 1,j + 1)]: output+=u'\u2510' else: output+=u'\u252C' else: if tileDict[(i,j + 1)] == tileDict[(i + 1,j + 1)]: if tileDict[(i,j)] == tileDict[(i,j + 1)]: output +=u'\u2514' else: if tileDict[(i + 1,j)] == tileDict[(i + 1,j + 1)]: output +=u'\u2518' else: output +=u'\u2534' else: if tileDict[(i,j)] == tileDict[(i,j + 1)]: if tileDict[(i + 1,j)] == tileDict[(i + 1,j + 1)]: output +=u'\u2502' else: output +=u'\u251C' else: if tileDict[(i + 1,j)] == tileDict[(i + 1,j + 1)]: output +=u'\u2524' else: output +=u'\u253C' if tileDict[(width - 1,j)] == tileDict[(width - 1,j + 1)]: output+=u'\u2502' else: output+=u'\u2524' output +="\n" output += u'\u2514' for i in range(width - 1): if tileDict[(i,height - 1)] == tileDict[(i + 1,height - 1)]: output+=u'\u2500' else: output+=u'\u2534' output+=u'\u2518\n' return output grid = Grid(9,5) found = [] tilings = grid.tile([(0,0),(0,1),(1,0)], []) print(len(tilings))
Run
Reset
Share
Import
Link
Embed
Language▼
English
中文
Python Fiddle
Python Cloud IDE
Follow @python_fiddle
Browser Version Not Supported
Due to Python Fiddle's reliance on advanced JavaScript techniques, older browsers might have problems running it correctly. Please download the latest version of your favourite browser.
Chrome 10+
Firefox 4+
Safari 5+
IE 10+
Let me try anyway!
url:
Go
Python Snippet
Stackoverflow Question