例題 2 6 棋盤覆蓋

2021-07-23 02:56:57 字數 1430 閱讀 4887

一道很有趣的遞迴與分治的題目。

關鍵搞好各個位置的下標關係,以及將整個圖分為四部分,如果特殊點不在此部分,則將整個圖中間的三個方塊標記為特殊點。注釋很詳細。

畫了一張圖(主要是還得交作業,不然才不畫呢,哈哈哈哈):

先貼上遞迴實現的**:

/*

棋盤覆蓋的遞迴演算法

棋盤大小為size(2^k)*size大小

*/

#includeconst int max=16;

int map[max][max];

using namespace std;

int tile;

void chessboard(int lr,int lc,int dr,int dc,int size)

else//覆蓋到左下角

//處理左下角部分

if(dr>=lr+s&&dc=lr+s&&dc>=lc+s)

else//覆蓋到左上角

}void display()

;stacks;

void init()

void solve()

//被分割後的塊大小

int sz=tmp.size/2;

//下乙個入棧結點值得初始化

node next=tmp;

next.size=tmp.size/2;

next.num=cnt++;

//處理左上角部分

if(tmp.dx=tmp.sy+sz)

else

next.num=cnt++;

//處理左下角的部分

if(tmp.dx>=tmp.sx+sz&&tmp.dy=tmp.sx+sz&&tmp.dy>=tmp.sy+sz)

else

} }void display()

;queues;

void init()

void solve()

//被分割後的塊大小

int sz=tmp.size/2;

//下乙個入棧結點值得初始化

node next=tmp;

next.size=tmp.size/2;

next.num=cnt++;

//處理左上角部分

if(tmp.dx=tmp.sy+sz)

else

next.num=cnt++;

//處理左下角的部分

if(tmp.dx>=tmp.sx+sz&&tmp.dy=tmp.sx+sz&&tmp.dy>=tmp.sy+sz)

else

} }void display()

{ for(int i=0;i

棋盤覆蓋問題

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 所示...