一道很有趣的遞迴與分治的題目。
關鍵搞好各個位置的下標關係,以及將整個圖分為四部分,如果特殊點不在此部分,則將整個圖中間的三個方塊標記為特殊點。注釋很詳細。
畫了一張圖(主要是還得交作業,不然才不畫呢,哈哈哈哈):
先貼上遞迴實現的**:
/*
棋盤覆蓋的遞迴演算法
棋盤大小為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 所示...