有乙個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個特殊棋盤中的乙個 題目...