欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

棋盘覆盖问题(python实现)

程序员文章站 2022-05-22 12:37:39
...
  • 问题描述

  在一个 个方格组成的棋盘中,有一个方格与其它的不同,使用四种L型骨牌覆盖除这个特殊方格的其它方格,请使用分治法实现棋盘覆盖

<1>分析:

由于原棋盘只有一个特殊方格,我们首先将棋盘规格从 减少一半分割为4个 子棋盘(a)所示,这4个子棋盘中只有一个子棋盘包含该特殊方格,其余3个子棋盘中没有特殊方格。为了将这3个没有特殊方格的子棋盘转化为特殊棋盘,以便采用递归方法求解,可以用一个L型骨牌覆盖这3个较小棋盘的会合处,如图(b)所示,从而将原问题转化为4个较小规模的棋盘覆盖问题。递归地使用这种划分策略,直至将棋盘分割为1×1的子棋盘。

棋盘覆盖问题(python实现)

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)

 

  • 实验结果与分析
  • 棋盘覆盖问题(python实现)
  •  
  •  
  •  
  • 刚开始在 [2][2]处输入特殊棋子
  • 棋盘覆盖问题(python实现)
  • 当函数开始,会将棋盘格分为4个小棋盘,进行第一次操作,将分后子棋盘中没有特殊格子的其余3个棋盘格顶点处格子标1。
  • 棋盘覆盖问题(python实现)
  • 此时size减半,原问题变为四个小规模的(4x4)棋盘格问题,而其余三个棋盘格中,标1的格子成为特殊格子,以进行递归过程。

  • 棋盘覆盖问题(python实现)

  • 当此时,三个格子被标记为3后,重复递归,size=2//2=1。

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

    重复操作直至结束。

相关标签: 棋盘覆盖 算法