演算法實現(6)棋盤覆蓋

2021-07-03 00:20:23 字數 1245 閱讀 3210

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

當k>0時,將2k×2k棋盤分割為4個2k-1×2k-1 子棋盤(a)所示。

特殊方格必位於4個較小棋盤之一中,其餘3個沒有特殊方格。為了將這3個無特殊方格的子棋盤轉化為特殊棋盤,我們可以用乙個l型骨牌覆蓋這3個較小棋盤的會合處,如 (b)所示,這3個子棋盤上被l型骨牌覆蓋的方格就成為該棋盤上的特殊方格,從而將原問題轉化為4個較小規模的棋盤覆蓋問題。遞迴地使用這種分割,直至棋盤簡化為棋盤1×1。

在構造剩下沒特殊方格三個子棋盤時,我們也是在他們中的也假乙個方格設為特殊方格。如果是: 

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

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

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

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

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+s, tc, dr, dc, s); // 特殊方格在此棋盤中

else // 覆蓋其餘方格

//覆蓋右下角子棋盤

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

chessboard(tr+s, tc+s, dr, dc, s);// 特殊方格在此棋盤中

else // 覆蓋其餘方格

}

tr:棋盤左上角方格的行號

tc:棋盤左上角方格的列號

dr:特殊方格所在的行號

dc:特殊方格所在的列號

size:棋盤的規格2k×2k

複雜度分析

當k>0時,每一次都分成4個比它小乙個規模的子棋盤,所以有t(k) = 4t(k-1) 

棋盤覆蓋演算法

在乙個2k 2k個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤,顯然特殊方格在棋盤上出現的位置有4k種情形。因而對任何k 0,有4k種不同的特殊棋盤。特殊方格必位於4個較小子棋盤之一中,其餘3個子棋盤中無特殊方格。為了將這3個無特殊方格的子棋盤轉化為特殊...

棋盤覆蓋問題的演算法實現

在乙個2 k 2 k個方格組成的棋盤中,有乙個方格與其它的不同,若使用以下四種l型骨牌覆蓋除這個特殊方格的其它方格,如何覆蓋。四各l型骨牌如下圖1 圖1 棋盤中的特殊方格如圖2 圖2實現的基本原理是將2 k 2 k的棋盤分成四塊2 k 1 2 k 1 的子棋盤,特殊方格一定在其中的乙個子棋盤中,如果...

分治演算法 棋盤覆蓋

問題描述 在乙個2 k 2 k 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用圖示的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。解題思路 分析 當k 0時,將2k 2k棋盤分...