分治法 棋盤覆蓋問題

2021-07-12 05:24:00 字數 3183 閱讀 7994

棋盤覆蓋問題。有乙個2k

∗2k 的方格棋盤,恰有乙個方格是黑色的,其他為白色。你的任務是用包含3個方格的l型牌覆蓋所有白色方格。黑色方格不能被覆蓋,且任意乙個白色方格不能同時被兩個或更多牌覆蓋。如圖所示為l型牌的4種旋轉方式。

分治三步驟

劃分問題:將 2

k∗2k

的棋盤劃分為 2

k−1∗

2k−1

這樣的子棋盤4塊。

遞迴求解:遞迴填充各個格仔,填充分為四個情況,在下面會有解釋,遞迴出口為 k

=0也就是子棋盤方格數為1。

合併問題:不需要合併子問題。

遞迴填充的四種情況

如果黑方塊在左上子棋盤,則遞迴填充左上子棋盤;否則填充左上子棋盤的右下角,將右下角看做黑色方塊,然後遞迴填充左上子棋盤。

如果黑方塊在右上子棋盤,則遞迴填充右上子棋盤;否則填充右上子棋盤的左下角,將左下角看做黑色方塊,然後遞迴填充右上子棋盤。

如果黑方塊在左下子棋盤,則遞迴填充左下子棋盤;否則填充左下子棋盤的右上角,將右上角看做黑色方塊,然後遞迴填充左下子棋盤。

如果黑方塊在右下子棋盤,則遞迴填充右下子棋盤;否則填充右下子棋盤的右下角,將左上角看做黑色方塊,然後遞迴填充右下子棋盤。

// 對半劃分成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

}

#include 

using

namespace

std;

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++)

cout

<< endl << endl << endl;}}

return

0;}

(x,y)從(0,0)開始,輸入資料為0

00即結束程式。

請輸入棋盤大小和黑色方格位置(x,y):200

1222

(x,y)從(0,0)開始,輸入資料為0

00即結束程式。

請輸入棋盤大小和黑色方格位置(x,y):411

3344

3124

5226

5566

(x,y)從(0,0)開始,輸入資料為0

00即結束程式。

請輸入棋盤大小和黑色方格位置(x,y):822

4455

99101043

3598

81063

171111812

6677

2111212

1414152

2192020

1413

1515

1919

1820

1613

1317

2118

1822

1616

1717

2121

2222

(x,y)從(0,0)開始,輸入資料為0

00即結束程式。

請輸入棋盤大小和黑色方格位置(x,y):000

process returned 0 (0x0) execution time : 29.988 s

press any key to continue.

分治法 棋盤覆蓋問題

在2k 2k的棋盤中有乙個特殊方格,特殊方格的位置共有4k種情況。下圖是22 22棋盤的一種情況 棋盤覆蓋問題要求用下圖中四種不同形態的l型骨牌覆蓋這乙個棋盤,並且l型骨牌之間不能重疊。每個l型骨牌佔三個格,拋去特殊方格,棋盤一共還剩4k 1個格,因此需要的方格數為 4k 1 3個。上例的棋盤經填充...

棋盤覆蓋問題(分治法)

有乙個2k 2k k 0 的棋盤,恰好有乙個方格與其他方格不同,稱之為特殊方格,並且稱該棋盤為一特殊棋盤。現在要用4種不同形狀的三格骨牌覆蓋除了特殊方格外的其他全部方格,並且任何兩個三格骨牌不能重疊。請給出一種覆蓋方案 特殊棋盤 k 3時 四種形狀的三格骨牌 使用二分法對整個棋盤進行劃分 分為四個象...

棋盤覆蓋問題 分治法

棋盤覆蓋問題 問題描述 在乙個2 k 2 k個方格組成的棋盤中,若有乙個方格與其他方格不同,則稱該方格為一特殊方格,且稱該棋盤為乙個特殊棋盤.顯然特殊方格在棋盤上出現的位置有4 k種情形.因而對任何 k 0,有4 k種不同的特殊棋盤.下圖 圖 1 中的特殊棋盤是當k 3時16個特殊棋盤中的乙個 題目...