C語言解決棋盤覆蓋問題

2021-08-21 13:05:11 字數 2052 閱讀 3905

棋盤覆蓋問題是典型的利用分治法解決問題

把大問題分解成為相同性質的子問題

分治的技巧在於如何劃分棋盤,使劃分後的子棋盤的大小相同,並且每個子棋盤均包含乙個特殊方格,從而將原問題分解為規模較小的棋盤覆蓋問題。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型骨牌不得重疊覆蓋。這裡我們用分治法解決該問題。分治...