棋盤覆蓋演算法

2021-06-16 17:51:43 字數 884 閱讀 6108

在乙個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型骨牌 覆蓋乙個帶有乙個特殊方格的棋盤,特殊方塊上不能覆蓋骨牌,其他方塊上...