小编yee*_*haw的帖子

棋盘覆盖递归算法背后的直觉是什么?如何更好地制定这样的算法?

你可能听说过经典的棋盘覆盖拼图.如何使用L形瓷砖覆盖缺少一个角落方格的棋盘?

正如"Python语言中的Python算法掌握基本算法"一书中所解释的那样,有一种递归方法.

我们的想法是将电路板分成4个较小的方块,然后将L形瓷砖放入较大电路板的中心,有效地创建4个较小的方块,其中一个瓷砖丢失并继续通过递归.

从概念上讲,它很容易理解,但我发现很难想到一个实现.这是一个实施解决方案 -

    def cover(board, lab=1, top=0, left=0, side=None):
        if side is None: side = len(board)

        # Side length 
        s = side // 2

        # Offsets for outer/inner squares of subboards
        offsets = ((0, -1), (side-1, 0))

        for dy_outer, dy_inner in offsets:
            for dx_outer, dx_inner in offsets:
            # If the outer corner is not set...
                if not board[top+dy_outer][left+dx_outer]:
                # ... label the inner corner: 
                    board[top+s+dy_inner][left+s+dx_inner] = lab


        # Next label: 
        lab += 1
        if s > 1:
            for …
Run Code Online (Sandbox Code Playgroud)

python algorithm recursion functional-programming induction

6
推荐指数
1
解决办法
450
查看次数