棋盘覆盖问题(python实现)

  • 问题描述

  在一个 个方格组成的棋盘中,有一个方格与其它的不同,使用四种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。

    结束此分支问题的递归。进行右上方的递归。

    重复操作直至结束。

发布了218 篇原创文章 · 获赞 309 · 访问量 29万+

猜你喜欢

转载自blog.csdn.net/qq_42777804/article/details/102942858