Skip to content

递归:棋盘分割问题 #2

Description

@sunstrikes

问题:8*8的棋盘缺个角,问,如何用L型的地板砖铺满。

def cover(board, lab=1, top=0, left=0, side=None):
    if side is None: side = len(board)
    s = side // 2
    offsets = (0,-1), (side-1,0)
    #outer 用来检测哪个角上缺了个
    #inner 用来把棋盘分割为4个子问题
    for dy_outer, dy_inner in offsets:
        for dx_outer, dx_inner in offsets:
            if not board[top+dy_outer][left+dx_outer]:
                board[top+dy_inner+s][left+dx_inner+s] = lab

    lab += 1
    if s > 1:
        for dy in [0,s]:
            for dx in [0,s]:
                lab = cover(board, lab, top+dy, left+dx, s)
    return lab
board = [[0]*8 for i in range(8)]
board[7][7] = -1
cover(board)
for row in board:
    print((" %2i"*8)% tuple(row))

result:

  3  3  4  4  8  8  9  9
  3  2  2  4  8  7  7  9
  5  2  6  6 10 10  7 11
  5  5  6  1  1 10 11 11
 13 13 14  1 18 18 19 19
 13 12 14 14 18 17 17 19
 15 12 12 16 20 17 21 21
 15 15 16 16 20 20 21 -1

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions