在乙個2k × 2k個方格組成的棋盤中,若恰有乙個方格與其他方格不同,則稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。現用若干個l型骨牌覆蓋在乙個給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋
我們先來看乙個k = 2時的棋盤覆蓋問題
那我們怎麼去解決這個問題呢?如果採用分治的思想去看這個問題的話,就應該是去將乙個2k × 2k 的特殊棋盤分解成子問題,而這個子問題應該就是將棋盤等分成4個2k-1 × 2k-1相同規模的棋盤。
但是這裡就出現了問題,可以很明顯的發現,我們劃分出來的子問題和原問題不是同相同的問題。子問題中特殊方格一定存在於4個子棋盤中的任意1個,但是其他3個棋盤中不存在特殊方格,也就不再是特殊棋盤,因此這兩個子問題是不同的
如何解決這個問題?
我們可以通過乙個l型的骨牌來使得4個相同規模的子問題相同,即將其他的3個棋盤也加上特殊方格
以該棋盤為例
;// tc, tr: 棋盤左上角的行號和列號
// dc, dr: 特殊方格的行號和列號
// size = 2 ^ k
int tile =1;
//tile為當前骨牌的號數
void
chessboard
(int tr,
int tc,
int dr,
int dc,
int size)
else
// 不在此棋盤,將此棋盤右下角設為相應的骨牌號
//特殊方格在右上角子棋盤
if(dr < tr + s && dc >= tc + s)
else
// 不在此棋盤,將此棋盤左下角設為相應的骨牌號
//特殊方格在左下角子棋盤
if(dr >= tr + s && dc < tc + s)
else
// 不在此棋盤,將此棋盤右上角設為相應的骨牌號
//特殊方格在左上角子棋盤
if(dr >= tr + s && dc >= tc + s)
else
// 不在此棋盤,將此棋盤左上角設為相應的骨牌號
}int
main()
printf
("\n");
}}
棋盤覆蓋問題 題解
問題描述 在乙個 2 k 2 k 個方格組成的棋盤中,若恰有乙個方格與其它方格不同,則稱該方格為一特殊方格,稱該棋盤為一特殊棋盤。顯然特殊方格在棋盤上出現的位置有 4 k 種情形。因而對任何 k 0 有 4 k 種不同的特殊棋盤。下圖所示的特殊棋盤為 k 2 時 16 個特殊棋盤中的乙個。在棋盤覆蓋...
棋盤覆蓋問題
source code include include include using namespace std const int n 1024 int board n n count void cover int sx,int sy,int cx,int cy,int size,int cx1,i...
棋盤覆蓋問題
問題 在乙個2k 2k k 0 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為特殊方格。顯然,特殊方格在棋盤中可能出現的位置有4k種,因而有4k種不同的棋盤,圖4.10 a 所示是k 2時16種棋盤中的乙個。棋盤覆蓋問題 chess cover problem 要求用圖4.10 b 所示...