在乙個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
相同數字的為同一骨牌。
#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
");}return0;
}
分治 棋盤覆蓋問題
描述 在乙個2 k 2 k個方格組成的棋盤中,任意存在乙個特殊方格,那麼總有 4 k 1 3個l型骨牌可以將剩餘方格完全覆蓋。分析 將棋盤橫豎四等分,則特殊方格必存在於某一區域。存在特殊方格的區域自然可以完全覆蓋,其餘三個無特殊方格的區域必須去掉乙個方格方可用l型骨牌完全覆蓋。故,將三區域相鄰部分用...
分治法 棋盤覆蓋問題
棋盤覆蓋問題。有乙個2k 2k 的方格棋盤,恰有乙個方格是黑色的,其他為白色。你的任務是用包含3個方格的l型牌覆蓋所有白色方格。黑色方格不能被覆蓋,且任意乙個白色方格不能同時被兩個或更多牌覆蓋。如圖所示為l型牌的4種旋轉方式。分治三步驟 劃分問題 將 2 k 2k 的棋盤劃分為 2 k 1 2k 1...
棋盤覆蓋問題(分治,遞迴)
在乙個2 k 2 k個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。該棋盤為特殊棋盤,紅色的方格為特殊方格。棋盤覆蓋問題是指,要用圖2中的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。該問題就是在考察...