棋盤覆蓋問題(分治法)

2021-10-05 04:56:34 字數 2120 閱讀 9955

有乙個2k×2k(k>0)的棋盤,恰好有乙個方格與其他方格不同,稱之為特殊方格,並且稱該棋盤為一特殊棋盤。現在要用4種不同形狀的三格骨牌覆蓋除了特殊方格外的其他全部方格,並且任何兩個三格骨牌不能重疊。請給出一種覆蓋方案

特殊棋盤(k=3時)

四種形狀的三格骨牌

①使用二分法對整個棋盤進行劃分(分為四個象限)

②對特殊方格所不在的象限中心進行填充

③對每個象限再次使用二分法進行劃分(分為四個象限)

④對特殊方格所不在的象限中心進行填充

⑤繼續對每個小象限進行劃分

⑥再次進行填充,即完成

初始化棋盤

//棋盤

private int board;

//不同型別的三格骨牌

private int type;

/** * 初始化棋盤

* @param x 棋盤行數

* @param y 棋盤列數

* @param m 棋盤特殊點橫座標

* @param n 棋盤特殊點縱座標

*/public chesscover(int x,int y, int m, int n)

構造棋盤

**該演算法中需要注意的是臨界值的考慮,即 、<=、>=的使用

/**

* 使用二分法鋪滿棋盤

* @param x 開始橫座標(棋盤頂角)

* @param y 開始縱座標(棋盤頂角)

* @param dx 特殊點橫座標

* @param dy 特殊點縱座標

* @param size 劃分後的棋盤大小

*/private void checover(int x, int y, int dx, int dy, int size)

//不同型別的三格骨牌

int i = this.type++;

//將棋盤分割為四個象限

size = size/2;

//處理左上角

if(dx < x+size && dy < y+size) else

//處理右上角

if(dx < x+size && dy >= y+size) else

//處理左下角

if(dx >= x+size && dy < y+size) else

//處理右下角

示例:

時間遞迴方程:

t(1)= o(1)                   k=0

t(k) = 4t(k-1) + o(1)     k>0

即,平均時間複雜度為t(k) = o(4k)

由於在覆蓋2k*2k大小的棋盤時使用了(4k-1)/3個三格骨牌,與時間分治法求得的時間複雜度同階,即該演算法是漸進最優演算法

空間s(n) = o(1)

分治法 棋盤覆蓋問題

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

分治法 棋盤覆蓋問題

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

棋盤覆蓋問題 分治法

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