解題思路:這一題使用遞迴的解法比較便於理解,這裡可以採用前面使用過的分治演算法,將整個棋盤分成四個部分。直接劃分後只有乙個部分會有黑色圖塊,而其餘三個部分則都是白色圖塊。這裡可以採取人為新增的方式。在其餘三個部分增加乙個骨牌覆蓋到三個部分,這樣每個區塊又都會包含黑色圖塊,然後分部分繼續求解。遞迴的返回條件則是劃分的圖塊只有一塊時,直接返回即可。注意學習題目的遞迴思想。
題目大意:
棋盤覆蓋問題要求在2^k * 2^k 個方格組成的棋盤中,你給定任意乙個特殊點,用一種方案實現對除該特殊點的棋盤實現全覆蓋。
建立模型如圖:
解決方案就是利用分治法,將方形棋盤分成4部分,如果該特殊點在某一部分,我們就去遞迴他,如果不在某一部分,我們假設乙個點為特殊點,同樣遞迴下去,知道全覆蓋。
左上角的子棋盤(若不存在特殊方格):則將該子棋盤右下角的那個方格假設為特殊方格;
右上角的子棋盤(若不存在特殊方格):則將該子棋盤左下角的那個方格假設為特殊方格;
左下角的子棋盤(若不存在特殊方格):則將該子棋盤右上角的那個方格假設為特殊方格;
右下角的子棋盤(若不存在特殊方格):則將該子棋盤左上角的那個方格假設為特殊方格;
#include#include#includeusing namespace std;
int ch[1000][1000];
void divide(int sx,int sy,int row,int x,int y)
else if(x>=midx&&y=midx&&y>=midy) }
int main()
cout<
} cout<
} return 0;
}
演算法 遞迴 棋盤覆蓋問題
1 最小情況 2 原問題與子問題同型 3 原問題的解可以用子問題的解來構造 在乙個2的k次方 x 2的k次方 此處數學公式的插入待修改 個方格的棋盤中,恰有乙個方格與其他方格不同,則稱該方格為特殊方格,在棋盤覆蓋問題中,要用l型骨牌 覆蓋乙個帶有乙個特殊方格的棋盤,特殊方塊上不能覆蓋骨牌,其他方塊上...
棋盤覆蓋問題(分治,遞迴)
在乙個2 k 2 k個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。該棋盤為特殊棋盤,紅色的方格為特殊方格。棋盤覆蓋問題是指,要用圖2中的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。該問題就是在考察...
遞迴 棋盤覆蓋
問題描述 在乙個2 k 2 k 的方格組成的棋盤中,有乙個方格與其他方格不同,稱為特殊方格。現在邀請4中不同的l型骨牌 覆蓋給定的棋盤除特殊方格外的所有方格。例如 這是乙個k 2時的棋盤,特殊點座標為 0,1 四中l型骨牌如圖 程式 include define key 8 棋盤的階數 int ar...