ChessBoard棋盤覆蓋問題

2021-06-04 23:26:19 字數 1044 閱讀 4129

棋盤覆蓋問題是乙個經典的分治問題的演算法,它其中的思想,就是分而治之。

怎麼體現分而治之的思想是這個問題的關鍵。

首先,將棋盤分為四個小的方塊,體現了分,但是卻破壞了問題的統一性,因為小的方塊中,三個塊中沒有特殊的方塊。

所以為了不破壞分而不亂的思想,我們可以在每乙個小塊中加乙個特殊的小方塊,但是加乙個小方塊,隨便填的話,同樣還是破壞了分的目的,故,書本上給出了一種比較高明的技巧,在沒有特殊塊的方塊中,將乙個l型的塊放到三個塊的交界處,一來,這是一種往棋盤填塊的方式,不破壞題意的目的,二來,又增加了其他三個無特殊塊的方格,三個特殊方格。可謂是一舉兩得,這樣使得分開之後的問題與原問題是一樣的,只有這樣才可以用分治法來處理。

下面上**同樣的,使用了c++**

//棋盤覆蓋

#include#include#include#define size 8

using namespace std;

int board[size][size];//棋盤座標

int kind; //放置牌的種類

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

}int main(){

memset(board,0,sizeof(board));//棋盤初始化為0

cout<<"initnation the board!the curent sutation is:"<

棋盤覆蓋問題

source code include include include using namespace std const int n 1024 int board n n count void cover int sx,int sy,int cx,int cy,int size,int cx1,i...

棋盤覆蓋演算法

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

棋盤覆蓋問題

問題 在乙個2k 2k k 0 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為特殊方格。顯然,特殊方格在棋盤中可能出現的位置有4k種,因而有4k種不同的棋盤,圖4.10 a 所示是k 2時16種棋盤中的乙個。棋盤覆蓋問題 chess cover problem 要求用圖4.10 b 所示...