分治演算法 殘缺棋盤

2021-10-04 03:45:12 字數 1652 閱讀 4009

殘缺棋盤是乙個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

print

(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 保證互不相...