递归学习:棋盘拼接
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形砖的拼接。
整副棋盘由大化小。
以上是关于递归学习:棋盘拼接的主要内容,如果未能解决你的问题,请参考以下文章