殘缺棋盤是乙個2^k*2^個方格的棋盤,其中恰有1個方格殘缺。圖中給出,其中殘缺部分用陰影表示。
這樣的棋盤稱為"三格板",殘缺棋盤問題就是用這四種三格板覆蓋更大的殘缺棋盤。再次覆蓋中要求:
(1)兩個三格板不能重複。
(2)三格板不能覆蓋殘缺棋盤方格,但必須覆蓋到其他所有的方格。
演算法思路:
利用分治演算法將棋盤細化,逐步解決,以4*4為例
首先判斷殘缺的位置在**,然後在中間填上對應的三格板,如在上圖中間拼上三角板(4),變成下面這樣
然後通過中間將其分成了4個2*2的小殘缺棋盤,從而問題得以解決
4*4的分析過於簡單,現在我們以8*8為例進行分析,能更清楚的理解這個例子中分治演算法的思想
首先將三格板放置在中間,將其分4個小的4*4的殘缺棋盤
通過紅色線將其劃分成4個4*4的殘缺棋盤,現在以左上的殘缺棋盤為例
然後將左的4*4的小棋盤右劃分成了4個2*2的小棋盤,這樣就將問題優化成了2*2的三角棋盤的小問題,這樣很快就能將左上的4*4的殘缺棋盤解決了
下面繼續分析右上的4*4的棋盤,根據殘缺的方格在小棋盤中的位置,在中間選擇合適的三格板將小的殘缺棋盤繼續劃分,將問題分化成更小的狀態
接著的問題和上面一樣分析。右上角的小棋盤很快也能解決了,下面兩塊殘缺棋盤的分析方法和上面的一樣,整個問題就這樣一步步的分解成小問題,然後解決了。
下面是源**
#include
using
namespace
std;
int amount,board[
100][
100];
void
cover
(int tr,int tc,int dr,int dc,int size)
else
if(dr=tc+s)
//殘缺在右上角
else
if(dr>=tr+s&&dc//殘缺在左下
else
}void
(int s)
}int
main
()
2 2 1 殘缺棋盤
殘缺棋盤 defective chessboard 是乙個有2k 2k 個方格的棋盤,其中恰有乙個方格殘缺。圖2 3給出k 2時各種可能的殘缺棋盤,其中殘缺的方格用陰影表示。注意當k 0時,僅存在一種可能的殘缺棋盤 如圖1 4 3 a所示 事實上,對於任意k,恰好存在22k 種不同的殘缺棋盤。殘缺棋...
分治演算法 棋盤覆蓋
問題描述 在乙個2 k 2 k 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用圖示的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。解題思路 分析 當k 0時,將2k 2k棋盤分...
殘缺的棋盤 數學
題目 i.殘缺的棋盤 在西洋棋裡,王是最重要的乙個棋子。每一步,王可以往上下左右或者對角線方向移動一 步,如下圖所示。給定兩個格仔 a r1,c1 b r2,c2 你的任務是計算出乙個王從 a到 b至少需要走多少步。為了 避免題目太簡單,我們從棋盤裡拿掉了乙個格仔 c r3,c3 abc 保證互不相...