棋盤覆蓋問題是乙個經典的分治問題的演算法,它其中的思想,就是分而治之。
怎麼體現分而治之的思想是這個問題的關鍵。
首先,將棋盤分為四個小的方塊,體現了分,但是卻破壞了問題的統一性,因為小的方塊中,三個塊中沒有特殊的方塊。
所以為了不破壞分而不亂的思想,我們可以在每乙個小塊中加乙個特殊的小方塊,但是加乙個小方塊,隨便填的話,同樣還是破壞了分的目的,故,書本上給出了一種比較高明的技巧,在沒有特殊塊的方塊中,將乙個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 所示...