棋盤覆蓋問題題解

2021-10-12 07:41:46 字數 1743 閱讀 1481

在乙個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 所示...