递归学习:棋盘拼接

题目:一块不完整的棋盘(就是某个地方缺了一个格子)一及y一块用于修补它的L形砖。

  讲棋盘分个割成四个正方形,有三个正方形是跟原来的一样,只有一个是缺了一个角的,但是在其他三个的交界处可以去掉一个L形砖,这样问题就跟原问题一样了,继续这样下去,化成一个个的子问题,把每个子问题解决了,再和其他就是原问题的解。

  代码如下:

 1 def cover(board,lab=1,top=0,left=0,side=None):
 2     if side is None:
 3         side=len(board)
 4     s=side//2# firstly s is  equal to four 
 5     offset=(0,-1),(side-1,0)
 6     for dy_outer,dy_inner in offset:
 7         for dx_outer,dx_inner in offset:
 8             if not board[top+dy_outer][left+dx_outer]:
 9                 board[top+s+dy_inner][left+s+dx_inner]=lab
10     if s>1:
11         for dy in [0,s]:
12             for dx in [0,s]:
13                 lab=cover(board,lab,top+dy,left+dx,s)
14 
15     return lab
16                         
17 board=[[0]*8 for i in range(8)]
18 board[7][7]=-1
19 cover(board)
20 for row in board:
21     print ((" %2i"*8) % tuple(row))

其中比较有趣的就是

offset=(0,-1),(side-1,0)
    for dy_outer,dy_inner in offset:
        for dx_outer,dx_inner in offset:

每次的 x,y=(side,side)都不会处理其所在规模的正方形的对角。而且用了一个点[s,s]来定了一个L形砖的拼接。

整副棋盘由大化小。

原文地址:https://www.cnblogs.com/liyuechan/p/10505302.html