棋盤覆蓋問題的演算法實現

2021-08-26 09:14:51 字數 1457 閱讀 4699

在乙個2^k * 2^k個方格組成的棋盤中,有乙個方格與其它的不同,若使用以下四種l型骨牌覆蓋除這個特殊方格的其它方格,如何覆蓋。

四各l型骨牌如下圖1

圖1 

棋盤中的特殊方格如圖2

圖2實現的基本原理是將2^k * 2^k的棋盤分成四塊2^(k - 1) * 2^(k - 1)的子棋盤,特殊方格一定在其中的乙個子棋盤中,如果特殊方格在某乙個子棋盤中,繼續遞迴處理這個子棋盤,直到這個子棋盤中只有乙個方格為止如果特殊方 格不在某乙個子棋盤中,將這個子棋盤中的相應的位置設為骨牌號,將這個無特殊方格的了棋盤轉換為有特殊方格的子棋盤,然後再遞迴處理這個子棋盤。以上原理 如圖3所示。

圖3將棋盤儲存在乙個二維陣列中。骨牌號從1開始,特殊方格為0,如果是乙個4 * 4的棋盤,特殊方格為(2,2),那麼程式的輸出為

2   2   3   3  

2   1   1   3  

4   1   0   5  

4   4   5   5

相同數字的為同一骨牌。

下面是棋盤覆蓋問題的c語言實現。

#include 

<

stdio.h

>

#define

board_size 4

intboard[board_size][board_size];

//c1, r1: 棋盤左上角的行號和列號

//c2, r2: 特殊方格的行號和列號

//size = 2 ^ k

void

chessboard(

intr1, 

intc1, 

intr2, 

intc2, 

intsize)

else

//不在此棋盤,將此棋盤右下角設為相應的骨牌號

if(r2 

<

r1 +

half_size 

&&c2 

>=

c1 +

half_size) 

//特殊方格在右上角子棋盤

else

//不在此棋盤,將此棋盤左下角設為相應的骨牌號

if(r2 

>=

r1 +

half_size 

&&c2 

<

c1 +

half_size) 

//特殊方格在左下角子棋盤

else

//不在此棋盤,將此棋盤右上角設為相應的骨牌號

if(r2 

>=

r1 +

half_size 

&&c2 

>=

c1 +

half_size) 

//特殊方格在左上角子棋盤

else

//不在此棋盤,將此棋盤左上角設為相應的骨牌號

}intmain()

printf("\n

");}}

棋盤覆蓋問題的遞迴演算法實現

問題描述 遞迴與分治策略演算法,用 4 種不同形態的 l 型骨牌覆蓋乙個給定的特殊棋盤上除特殊方格以外的所有方格,且任何 2 個 l 型骨牌不得重疊覆蓋。輸入資料由程式執行後的介面中的編輯框中輸入遊戲規模,特殊方格的位置。將覆蓋的結果在視窗中顯示出來。輸入輸出 通過鍵盤輸入 k 值和特殊方格位置,輸...

演算法實現(6)棋盤覆蓋

在乙個2k 2k 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用圖示的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。當k 0時,將2k 2k棋盤分割為4個2k 1 2k 1 子...

演算法 遞迴 棋盤覆蓋問題

1 最小情況 2 原問題與子問題同型 3 原問題的解可以用子問題的解來構造 在乙個2的k次方 x 2的k次方 此處數學公式的插入待修改 個方格的棋盤中,恰有乙個方格與其他方格不同,則稱該方格為特殊方格,在棋盤覆蓋問題中,要用l型骨牌 覆蓋乙個帶有乙個特殊方格的棋盤,特殊方塊上不能覆蓋骨牌,其他方塊上...