分治法解決棋盤覆蓋問題

2021-08-29 15:11:53 字數 887 閱讀 9329

在乙個2k x 2k ( 即:2^k x 2^k )個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用圖示的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。

這裡我們用分治法解決該問題。分治法是把乙個規模很大的問題分解為多個規模較小、類似的子問題,然後遞迴地解決所有子問題,最後再由子問題的解決得到原問題的解決。

【解題思路】:將2^k x 2^k的棋盤,先分成相等的四塊子棋盤,其中特殊方格位於四個中的乙個,構造剩下沒特殊方格三個子棋盤,將他們中的也假乙個方格設為特殊方格。如果是:

左上的子棋盤(若不存在特殊方格)----則將該子棋盤右下角的那個方格假設為特殊方格

右上的子棋盤(若不存在特殊方格)----則將該子棋盤左下角的那個方格假設為特殊方格

左下的子棋盤(若不存在特殊方格)----則將該子棋盤右上角的那個方格假設為特殊方格

右下的子棋盤(若不存在特殊方格)----則將該子棋盤左上角的那個方格假設為特殊方格

當然上面四種,只可能且必定只有三個成立,那三個假設的特殊方格剛好構成乙個l型骨架,我們可以給它們作上相同的標記。這樣四個子棋盤就分別都和原來的大棋盤類似,我們就可以用遞迴演算法解決。

**如下:

#includeint tile=1;

int board[100][100];

void chessboard(int tr, int tc, int dr, int dc, int size)

if(dr>=tr+s && dc=tr+s && dc>=tc+s)

chessboard(tr+s, tc+s, dr, dc, s);

else

} void main()

}

分治法 棋盤覆蓋問題

棋盤覆蓋問題。有乙個2k 2k 的方格棋盤,恰有乙個方格是黑色的,其他為白色。你的任務是用包含3個方格的l型牌覆蓋所有白色方格。黑色方格不能被覆蓋,且任意乙個白色方格不能同時被兩個或更多牌覆蓋。如圖所示為l型牌的4種旋轉方式。分治三步驟 劃分問題 將 2 k 2k 的棋盤劃分為 2 k 1 2k 1...

分治法 棋盤覆蓋問題

在2k 2k的棋盤中有乙個特殊方格,特殊方格的位置共有4k種情況。下圖是22 22棋盤的一種情況 棋盤覆蓋問題要求用下圖中四種不同形態的l型骨牌覆蓋這乙個棋盤,並且l型骨牌之間不能重疊。每個l型骨牌佔三個格,拋去特殊方格,棋盤一共還剩4k 1個格,因此需要的方格數為 4k 1 3個。上例的棋盤經填充...

棋盤覆蓋問題(分治法)

有乙個2k 2k k 0 的棋盤,恰好有乙個方格與其他方格不同,稱之為特殊方格,並且稱該棋盤為一特殊棋盤。現在要用4種不同形狀的三格骨牌覆蓋除了特殊方格外的其他全部方格,並且任何兩個三格骨牌不能重疊。請給出一種覆蓋方案 特殊棋盤 k 3時 四種形狀的三格骨牌 使用二分法對整個棋盤進行劃分 分為四個象...