描述:
在乙個2^k*2^k個方格組成的棋盤中,任意存在乙個特殊方格,那麼總有(4^k-1)/3個l型骨牌可以將剩餘方格完全覆蓋。
分析:
將棋盤橫豎四等分,則特殊方格必存在於某一區域。存在特殊方格的區域自然可以完全覆蓋,其餘三個無特殊方格的區域必須去掉乙個方格方可用l型骨牌完全覆蓋。故,將三區域相鄰部分用l型骨牌覆蓋,相當於每個區域佔乙個特殊方格。此時各可以完全覆蓋。
遞迴解決,將每乙個區域繼續劃分分析,直到大小為1,即可得解。
#include
int tile = 1; //l型骨牌編號
int board[8][8] = ;///board表示棋盤,此處為8*8棋盤
void chessboard(int tr, int tc, int dr, int dc, int size)
if(dr < tr+s && dc >= tc+s) //特殊方格在右上角區域,覆蓋此區域
chessboard(tr, tc+s, dr, dc, s);
else
if(dr >= tr+s && dc < tc+s) //特殊方格在左下角區域,覆蓋此區域
chessboard(tr, tc+s, tr+s-1, tc+s, s);
else
if(dr >= tr+s && dc >= tc+s) //特殊方格在右下角區域,覆蓋此區域
chessboard(tr+s, tc+s, dr, dc, s);
else
}int main()
printf("\n");
}return
0;}
分治法 棋盤覆蓋問題
棋盤覆蓋問題。有乙個2k 2k 的方格棋盤,恰有乙個方格是黑色的,其他為白色。你的任務是用包含3個方格的l型牌覆蓋所有白色方格。黑色方格不能被覆蓋,且任意乙個白色方格不能同時被兩個或更多牌覆蓋。如圖所示為l型牌的4種旋轉方式。分治三步驟 劃分問題 將 2 k 2k 的棋盤劃分為 2 k 1 2k 1...
棋盤覆蓋問題(分治,遞迴)
在乙個2 k 2 k個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。該棋盤為特殊棋盤,紅色的方格為特殊方格。棋盤覆蓋問題是指,要用圖2中的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。該問題就是在考察...
分治法 棋盤覆蓋問題
在2k 2k的棋盤中有乙個特殊方格,特殊方格的位置共有4k種情況。下圖是22 22棋盤的一種情況 棋盤覆蓋問題要求用下圖中四種不同形態的l型骨牌覆蓋這乙個棋盤,並且l型骨牌之間不能重疊。每個l型骨牌佔三個格,拋去特殊方格,棋盤一共還剩4k 1個格,因此需要的方格數為 4k 1 3個。上例的棋盤經填充...