棋盤覆蓋問題是典型的利用分治法解決問題
把大問題分解成為相同性質的子問題
分治的技巧在於如何劃分棋盤,使劃分後的子棋盤的大小相同,並且每個子棋盤均包含乙個特殊方格,從而將原問題分解為規模較小的棋盤覆蓋問題。k>0時,可將2^k×2^k的棋盤劃分為4個2^(k-1)×2^(k-1)的子棋盤,如圖4.11(a)所示。這樣劃分後,由於原棋盤只有乙個特殊方格,所以,這4個子棋盤中只有乙個子棋盤包含該特殊方格,其餘3個子棋盤中沒有特殊方格。為了將這3個沒有特殊方格的子棋盤轉化為特殊棋盤,以便採用遞迴方法求解,可以用乙個l型骨牌覆蓋這3個較小棋盤的會合處
void chessboard(int row, int column, int x, int y, int siz)
// 對半劃分成2^(siz - 1) * 2^(siz - 1)的棋盤
int s = siz / 2;
// l型牌編號自增
int t = ++number;
// 中間點,以此判別(x,y)在哪個子棋盤中
int centerrow = row + s;
int centercolumn = column + s;
// 黑色方格在左上子棋盤
if(x < centerrow && y < centercolumn) else
// 黑色方格在右上子棋盤
if(x < centerrow && y >= centercolumn) else
// 黑色方格在左下子棋盤
if(x >= centerrow && y < centercolumn) else
// 黑色方格在右下子棋盤
if(x >= centerrow && y >= centercolumn) else
解決此遞迴方程可得t( k )= o ( 4^k )
由於覆蓋乙個2^k*2^k棋盤所需的l型骨牌個數為( 4^k-1 )/ 3.
這個演算法chessboard是乙個在漸進意義下最優的演算法。
**實現
棋盤覆蓋
#include
const int maxnum = 1 << 10;
// 棋盤
int chess[maxnum][maxnum];
// l型牌編號
int number;
void chessboard(int row, int column, int x, int y, int siz)
// 對半劃分成2^(siz - 1) * 2^(siz - 1)的棋盤
int s = siz / 2;
// l型牌編號自增
int t = ++number;
// 中間點,以此判別(x,y)在哪個子棋盤中
int centerrow = row + s;
int centercolumn = column + s;
// 黑色方格在左上子棋盤
if(x < centerrow && y < centercolumn) else
// 黑色方格在右上子棋盤
if(x < centerrow && y >= centercolumn) else
// 黑色方格在左下子棋盤
if(x >= centerrow && y < centercolumn) else
// 黑色方格在右下子棋盤
if(x >= centerrow && y >= centercolumn) else
}int main()
// 塗黑(x,y),初始化l型牌編號
chess[x][y] = number = 1;
// 分治法填滿棋盤
chessboard(0, 0, x, y, siz);
// 輸出該棋盤
for(int i = 0; i < siz; i++)
printf("\n\n\n");}}
return 0;
}根據執行結果可以看出l型骨牌的分布情況
c 解決棋盤覆蓋問題
include include define board size 4 該棋盤矩陣的維度 using namespace std int board board size board size 宣告該棋盤矩陣 void chessboard int tr,int tc,int dr,int dc,i...
問題 C 棋盤覆蓋問題
題目描述 在乙個n n n 2k 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用圖示的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。輸入多組測試用例,每組測試用例包括兩部分,第...
分治法解決棋盤覆蓋問題
在乙個2k x 2k 即 2 k x 2 k 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用圖示的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。這裡我們用分治法解決該問題。分治...