棋盤覆蓋 演算法設計與分析

2021-09-12 01:42:35 字數 894 閱讀 3595

問題描述:在2^k*2^k個方格組成的棋盤中,若恰有乙個方格與其他方格不一樣,則稱這個方格為特殊方格,現在用四種不同形狀的l型骨牌來覆蓋該棋盤中除了特殊方格以外的其他方格。

分析:把該棋盤分成四個2^(k-1)*2^(k-1)個子棋盤,則特殊方格一定在某乙個子棋盤中。其餘三個子棋盤無特殊方格。為了用分治策略,想辦法把其他三個棋盤變成特殊棋盤,,,可以用l型骨牌覆蓋這三個較小棋盤的會合處,這三個棋盤中被l型骨牌覆蓋的方格就成了特殊方格。將原來的問題轉化成了4個規模較小的棋盤覆蓋問題,遞迴使用這種分割,直至棋盤簡化成1*1棋盤。

#include#include#includeusing namespace std;

int tile=1; //骨牌的編號

const int max=10000; //棋盤的最大規模

int board[max][max]; //board[0][0]是該棋盤的左上角方格

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

if(dr>=tr+s&&dc=tr+s&&dc>=tc+s) //特殊方格在右下角子棋盤中

chessboard(tr+s,tc+s,dr,dc,s);

else

}int main()

board[x][y]=0; //將特殊方格位置置為零

chessboard(0,0,x,y,n);

for(int i=0;isystem("pause");

return 0;

}

棋盤覆蓋 演算法分析 設計與實現(Java)

該篇雖然與很多的部落格 解說一樣講的都是棋盤覆蓋的解法。但是,該篇更多地傾向於 證明 這也是我與很多讀者都想知道的,而不是開篇就上 目錄0,問題描述.1 1,相關部落格.1 2,提出命題.1 3,命題證明.1 4,分析演算法.2 5,實現.2 k n k n 且棋盤中只有乙個特殊方塊時,一定可以用相...

演算法設計與分析之分治法 棋盤覆蓋

棋盤覆蓋問題要求在2 k 2 k 個方格組成的棋盤中,你給定任意乙個特殊點,用一種方案實現對除該特殊點的棋盤實現全覆蓋。建立模型如圖 解決方案就是利用分治法,將方形棋盤分成4部分,如果該特殊點在某一部分,我們就去遞迴他,如果不在某一部分,我們假設乙個點為特殊點,同樣遞迴下去,知道全覆蓋。左上角的子棋...

演算法設計與分析 分治法 棋盤覆蓋問題

tr 子棋盤x座標,tc 子棋盤y座標,dr 特殊方格x座標,dc 特殊方格y座標,size 棋盤邊長 初始tr,tc 0 public void chessboard int tr,int tc,int dr,int dc,int size 覆蓋右下角子棋盤 if dr tr s dc tc s ...