棋盤覆蓋問題(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。

    結束此分支問題的遞歸。進行右上方的遞歸。

    重複操作直至結束。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章