棋盘覆盖问题(python实现)
程序员文章站
2022-05-22 12:37:39
...
- 问题描述
在一个 个方格组成的棋盘中,有一个方格与其它的不同,使用四种L型骨牌覆盖除这个特殊方格的其它方格,请使用分治法实现棋盘覆盖
<1>分析:
由于原棋盘只有一个特殊方格,我们首先将棋盘规格从 减少一半分割为4个 子棋盘(a)所示,这4个子棋盘中只有一个子棋盘包含该特殊方格,其余3个子棋盘中没有特殊方格。为了将这3个没有特殊方格的子棋盘转化为特殊棋盘,以便采用递归方法求解,可以用一个L型骨牌覆盖这3个较小棋盘的会合处,如图(b)所示,从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种划分策略,直至将棋盘分割为1×1的子棋盘。
def chess(tr,tc,pr,pc,size):#tr:棋盘初始行号 tc:棋盘初始列号
#pr:特殊棋盘格行号 pc:特殊棋盘格列号
#size:棋盘格大小
global mark
global table
if size==1:
return #递归终止条件
mark+=1 #表示直角骨牌号
count=mark
half=size//2 #当size不等于1时,棋盘格规模减半,变为4个
#小棋盘格进行递归操作
#左上角
if (pr<tr+half) and (pc<tc+half):
chess(tr,tc,pr,pc,half)
else:
table[tr+half-1][tc+half-1]=count
chess(tr,tc,tr+half-1,tc+half-1,half)
#将[tr+half-1,tc+half-1]作为小规模棋盘格的特殊点,进行递归
#右上角
if (pr<tr+half) and (pc>=tc+half):
chess(tr,tc+half,pr,pc,half)
else:
table[tr+half-1][tc+half]=count
chess(tr,tc+half,tr+half-1,tc+half,half)
#将[tr+half-1,tc+half]作为小规模棋盘格的特殊点,进行递归
#左下角
if (pr>=tr+half) and (pc<tc+half):
chess(tr+half,tc,pr,pc,half)
else:
table[tr+half][tc+half-1]=count
chess(tr+half,tc,tr+half,tc+half-1,half)
#将[tr+half,tc+half-1]作为小规模棋盘格的特殊点,进行递归
#右下角
if (pr>=tr+half) and (pc>=tc+half):
chess(tr+half,tc+half,pr,pc,half)
else:
table[tr+half][tc+half]=count
chess(tr+half,tc+half,tr+half,tc+half,half)
#将[tr+half,tc+half]作为小规模棋盘格的特殊点,进行递归
#输出矩阵
def show(table):
n=len(table)
for i in range(n):
for j in range(n):
print(table[i][j],end=' ')
print('')
mark=0
n=8 #输入8*8的棋盘规格
table=[[-1 for x in range(n)] for y in range(n)] #-1代表特殊格子
chess(0,0,2,2,n) #特殊棋盘位置
show(table)
- 实验结果与分析
- 刚开始在 [2][2]处输入特殊棋子
- 当函数开始,会将棋盘格分为4个小棋盘,进行第一次操作,将分后子棋盘中没有特殊格子的其余3个棋盘格顶点处格子标1。
-
此时size减半,原问题变为四个小规模的(4x4)棋盘格问题,而其余三个棋盘格中,标1的格子成为特殊格子,以进行递归过程。
-
当此时,三个格子被标记为3后,重复递归,size=2//2=1。
结束此分支问题的递归。进行右上方的递归。
重复操作直至结束。
上一篇: 55_综合练习_画同心圆_和棋盘
下一篇: Java多线程编程---线程锁与读写锁