棋盘拼接问题

接上一篇博客的问题:http://blog.csdn.net/zhang_xiaomeng/article/details/72954471

程序如下:

def cover(board, lab=1, top=0, left=0, side=None):
    if side is None: side = len(board)
    # Side length of subboard:
    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 dy in [0, s]:
            for dx in [0, s]:
                # Recursive calls, if s is at least 2:
                lab = cover(board, lab, top+dy, left+dx, s)
                # Return the next available label:
    return lab

运行:

>>> board = [[0]*8 for i in range(8)]
>>> board[7][7] = -1
>>> cover(board)
22
>>> for row in board:
	print((" %2i"*8) % tuple(row))

	
  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

程序分析如下:





  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值