在乙個2k×2k個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤,顯然特殊方格在棋盤上出現的位置有4k種情形。因而對任何k>=0,有4k種不同的特殊棋盤。特殊方格必位於4個較小子棋盤之一中,其餘3個子棋盤中無特殊方格。為了將這3個無特殊方格的子棋盤轉化為特殊棋盤,可以用乙個l型骨牌覆蓋這3個較小棋盤的回合處,這3個子棋盤上被l型骨牌覆蓋的方格就成為該棋盤上的特殊方格,從而將原問題轉化為4個較小規模的棋盤覆蓋問題。遞迴地使用這種分割,直至棋盤簡化為1x1棋盤。
實現這種分治策略的演算法chessboard可實現如下:
public void chessboard(int tr, int tc, int dr, int dc, int size)
//覆蓋右上角子棋盤
if(dr=tc+s)
//特殊方格在此棋盤中
chessboard(tr,tc+s,dr,dc,s);
else
//覆蓋左下角子棋盤
if(dr>=tr+s&&dc
//特殊方格在此棋盤中
chessboard(tr+s,tc,dr,dc,s);
else
//覆蓋右下角子棋盤
if(dr>=tr+s&&dc>=tc+s)
//特殊方格在此棋盤中
chessboard(tr+s,tc+s,dr,dc,s);
else{//用t號l型骨牌覆蓋左上角
board[tr+s][tc+s]=t;
//覆蓋其餘方格
chessboard(tr+s,tc+s.tr+s,tc+s,s);
其中 tr:棋盤左上角方格的行號;tc:棋盤左上角方格的列號;dr: 特殊方格所在的行號;dc:特殊方格所在的列號;size: 2k,棋盤規格為2k×2k
分治演算法 棋盤覆蓋
問題描述 在乙個2 k 2 k 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用圖示的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。解題思路 分析 當k 0時,將2k 2k棋盤分...
演算法實現(6)棋盤覆蓋
在乙個2k 2k 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用圖示的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。當k 0時,將2k 2k棋盤分割為4個2k 1 2k 1 子...
演算法 遞迴 棋盤覆蓋問題
1 最小情況 2 原問題與子問題同型 3 原問題的解可以用子問題的解來構造 在乙個2的k次方 x 2的k次方 此處數學公式的插入待修改 個方格的棋盤中,恰有乙個方格與其他方格不同,則稱該方格為特殊方格,在棋盤覆蓋問題中,要用l型骨牌 覆蓋乙個帶有乙個特殊方格的棋盤,特殊方塊上不能覆蓋骨牌,其他方塊上...