為了方便,我這裡直接複製了別人的描述:
原貼鏈結
棋盤覆蓋
(一)原理介紹
在乙個2^k * 2^k個方格組成的棋盤中,恰有乙個方格與其它方格不同,稱該方格為一特殊方格,且稱該棋盤為以特殊棋盤。
在棋盤覆蓋問題中,要用圖示的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格之外的所有方格,且任何2個l型骨牌不得重疊覆蓋。
當k>0時,將2^k * 2^k棋盤分割為4個2^(k-1) * 2^(k - 1)子棋盤,如下圖所示。特殊方格必位於4個較小子棋盤之一種,其餘3個子棋盤中無特殊方格。為了將這3個無特殊方格的子棋盤轉化為特殊棋盤,可以用乙個l型骨牌覆蓋這3個較小棋盤的會合處,如下圖所示。從而將原問題轉化為4個較小規模的棋盤覆蓋問題。遞迴地使用這種分割,直至棋盤簡化為棋盤1*1。
為了更加清楚了解這個原理,下面引用:
這裡我們用分治法解決該問題。分治法是把乙個規模很大的問題分解為多個規模較小的類似的子問題,然後遞迴地解決所有子問題,最後再由子問題的解決得到原問題的解決。
【解題思路】//這個思路真的不錯,然我一下子就懂了。
將2^k * 2^k的棋盤,先分成相等的四塊子棋盤,其中特殊方格位於四個中的乙個,構造剩下沒特殊方格的三個字棋盤,將它們中的也假設乙個方格為特殊方格。如果是:
左上角的子棋盤(若不存在特殊方格
):則將該子棋盤右下角的那個方格假設為特殊方格;
右上角的子棋盤(若不存在特殊方格):則將該子棋盤左下角的那個方格假設為特殊方格;
左下角的子棋盤(若不存在特殊方格):則將該子棋盤右上角的那個方格假設為特殊方格;
右下角的子棋盤(若不存在特殊方格):則將該子棋盤左上角的那個方格假設為特殊方格;
當然,上面四種情況,只可能且必定只有三種成立,那三個假設的特殊方格剛好構成乙個l型骨牌,我們可以給它們作上相同的標誌。這樣四個子棋盤就分別都和原來的大棋盤類似,我們就可以用遞迴的演算法解決了。
感謝作者哈。
**:
#includeusing namespace std;
const int maxn=(1<<11);
int a[maxn][maxn],cnt;
void solve(int r1,int r2,int c1,int c2,int x,int y)
int main(){
int n,a,b;
while(cin>>n>>a>>b){
cnt=1;
solve(1,(1<
分治法 棋盤覆蓋問題
棋盤覆蓋問題。有乙個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時 四種形狀的三格骨牌 使用二分法對整個棋盤進行劃分 分為四個象...