分治法,棋盤覆蓋

2021-06-20 19:47:14 字數 1353 閱讀 9056

//分治法--棋盤覆蓋問題  

//問題描述:在乙個2k x 2k ( 即:2^k x 2^k )個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,

//且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用4不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,

//且任何2個l型骨牌不得重疊覆蓋。

//思想:將2^k x 2^k的棋盤,先分成相等的四塊子棋盤,其中特殊方格位於四個中的乙個,構造剩下沒特殊方格三個子棋盤,

//將他們中的也假乙個方格設為特殊方格。如果是:

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

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

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

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

//當然上面四種,只可能且必定只有三個成立,那三個假設的特殊方格剛好構成乙個l型骨架,我們可以給它們作上相同的標記。

//這樣四個子棋盤就分別都和原來的大棋盤類似,我們就可以用遞迴演算法解決。

//演算法說明:用乙個二維整形陣列board表示棋盤,board是棋盤左上角方格,

//tile是演算法中的乙個全域性整型變數,用來表示骨牌編號,初始值為0

//引數:tr是棋盤左上角的方格行號

//      tc是棋盤左上角的方格列號

//      dr是特殊方格所在行號

//      dc是特殊放個所在列號

//      size是2^k,棋盤是 2^k*2^k的

//      此程式可以實現檢測是否可以覆蓋

//      因為骨牌個數是4^k/3,只需檢測是否是整數 

//本題即使要求,將圖形分割,變為4個格仔的大小,然後4個格仔中有乙個被覆蓋,另外3個格仔被新的乙個覆蓋 

#include#includeusing namespace std;

int board[8][8]=;

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

void chessboard(int tr,int tc,int dr,int dc,int size)//左上行號,左上列號,特殊行號,特殊列號,棋盤大小 

}int main()

return 0;      

}//輸出即為格仔覆蓋狀況,同一標號為同一圖形 

//fout<0)相對於右對齊x位

//cout<

分治法 棋盤覆蓋

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

棋盤覆蓋(分治法)

include define maxnum 100 最大規模 using namespace std 變數設定 di 特定棋子橫座標 dj 特定棋子縱座標 hi 棋盤左上角橫座標 hj 棋盤左上角縱座標 tile 棋子序號 board 棋盤 maxnum 棋盤最大規模 int board maxnu...

分治法之棋盤覆蓋

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