棋盤覆蓋問題(遞迴與分治,紫書P229)

2021-07-16 00:03:06 字數 2205 閱讀 3776

在乙個 2^k * 2^k個方格組成的棋盤中,若恰有乙個方格與其它方格不同,則稱該方格為一特殊方格(黑色方格),稱該棋盤為一特殊棋盤。顯然特殊方格在棋盤上出現的位置有 4^k 種情形。因而對任何 k>=0 ,有 4^k 種不同的特殊棋盤。下圖所示的特殊棋盤為 k=2 時 16 個特殊棋盤中的乙個。

在棋盤覆蓋問題中,要用下圖中 4 中不同形態的 l 型骨牌覆蓋乙個給定的特殊棋牌上除特殊方格以外的所有方格,且任何 2 個 l 型骨牌不得重疊覆蓋。易知,在任何乙個 2^k * 2^k 的棋盤中,用到的 l 型骨牌個數恰為(4^k-1)/3(這個地方大家也可以下去算一下,筆者再者提示一下,要用到數學裡邊的二項分布,當然你如果你夠聰明

用分治策略,可以設計解棋盤問題的乙個簡捷的演算法。

當 k>0 時,將 2^k * 2^k 棋盤分割為 4 個 2^(k-1) * 2^(k-1) 子棋盤,如下圖所示。

特殊方格必位於 4 個較小子棋盤之一中,其餘 3 個子棋盤中無特殊方格。為了將這 3 個無特殊方格的子棋盤轉化為特殊棋盤,我們可以用乙個 l 型骨牌覆蓋這 3 個較小的棋盤的匯合處,如下圖所示,這 3 個子棋盤上被 l 型骨牌覆蓋的方格就成為該棋盤上的特殊方格,從而將原問題化為 4 個較小規模的棋盤覆蓋問題。遞迴的使用 這種分割,直至棋盤簡化為 1x1 棋盤,也就是說當他的size為1的時候直接return;。

注意:題目要求的是什麼?要求的是吧那個符合要求的整個**列印出來,就是把整個**裡邊**用到了l型,怎麼用的都要標記出來

我的這個**列印出來的例項,如輸入size=4,row=2,col=3;

說句題外話,大家也不要見怪,為什麼我的系統是xp

下邊來看看我的**:

#include

#include

#include

int ncount = 0;//用於記錄每乙個l型的編號,最大是多少就代表總共用到了多少個l

int matrix[100][100];//將最後的結果打成**

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

int main()

printf("\n");

}return 0;

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

int s,t;

if (1 == size) return;

s = size/2; //the number of grid the matrix's edge

t = ++ ncount;

//locate the special  grid on bottom right corner

if (dr < tr + s && dc < tc +s)//如果黑色方格就在指定的左上方的大方格裡邊就繼續遞迴分治

else//如果沒有找到,也就是說那個黑色方格並不在左上方,那麼就在左上方的大方格內部的右下方中填上資料,做標記

//昨晚標記後繼續在左上方遞迴分治

//locate the special  grid on bottom left corner

if (dr < tr + s && dc >= tc + s )//如果發現黑色方格在右上方就在右上方的大方格內繼續遞迴

else//就說明黑色方格不在右上方,那麼就在右上方的大方格裡邊的左下方做標記,昨晚標記後繼續在右上方遞給分治

if (dr >= tr + s && dc < tc + s)//剩下來的請讀者自行理解

else

//locate the special  grid on top left corner

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

else

}

棋盤覆蓋問題(遞迴與分治)

棋盤覆蓋問題。有乙個2k 2k2k 2k的方格棋盤,恰有乙個方格是黑色的,其他為白色。你的任務是用包含3個方格的l型牌覆蓋所有白色方格。黑色方格不能被覆蓋,且任意乙個白色方格不能同時被兩個或更多牌覆蓋。如圖所示為l型牌的4種旋轉方式。當乙個黑塊位於某一角時,可以解決乙個邊長為2的正方形匹配。可是這樣...

棋盤覆蓋問題(分治,遞迴)

在乙個2 k 2 k個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。該棋盤為特殊棋盤,紅色的方格為特殊方格。棋盤覆蓋問題是指,要用圖2中的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。該問題就是在考察...

遞迴與分治之棋盤覆蓋問題

在乙個2 k 2 k個方格組成的棋盤中,若有乙個方格與其他方格不同,則稱該方格為一特殊方格,且稱該棋盤為乙個特殊棋盤。顯然特殊方格在棋盤上出現的位置有4 k種情形.因而對任何k 0,有4 k種不同的特殊棋盤。下圖所示的特殊棋盤為 k 2 時 16 個特殊棋盤中的乙個。在棋盤覆蓋問題中,要用下圖中 4...