在乙個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型骨牌 覆蓋乙個帶有乙個特殊方格的棋盤,特殊方塊上不能覆蓋骨牌,其他方塊上...