递归学习:棋盘拼接

Posted liyuechan

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了递归学习:棋盘拼接相关的知识,希望对你有一定的参考价值。

题目:一块不完整的棋盘(就是某个地方缺了一个格子)一及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形砖的拼接。

整副棋盘由大化小。

 

以上是关于递归学习:棋盘拼接的主要内容,如果未能解决你的问题,请参考以下文章

棋盘n皇后问题-递归

扫雷C语言如何实现(含递归展开)

分治与递归-棋盘覆盖问题

递归,记忆化搜索,(棋盘分割)

POJ 1321-棋盘问题DFS+递归

利用生成器yield 递归解决八王后问题