2 2 1 殘缺棋盤

2021-03-31 08:56:30 字數 2126 閱讀 2481

殘缺棋盤(defective chessboard)是乙個有2k×2k 個方格的棋盤,其中恰有乙個方格殘缺。圖2 - 3給出k≤2時各種可能的殘缺棋盤,其中殘缺的方格用陰影表示。注意當k= 0時,僅存在一種可能的殘缺棋盤(如圖1 4 - 3 a所示)。事實上,對於任意k,恰好存在22k 種不同的殘缺棋盤。

殘缺棋盤的問題要求用三格板(t r i o m i n o e s)覆蓋殘缺棋盤(如圖1 4 - 4所示)。在此覆蓋中,兩個三格板不能重疊,三格板不能覆蓋殘缺方格,但必須覆蓋其他所有的方格。在這種限制條件下,所需要的三格板總數為( 22k -1 ) / 3。可以驗證( 22k -1 ) / 3是乙個整數。k 為0的殘缺棋盤很容易被覆蓋,因為它沒有非殘缺的方格,用於覆蓋的三格板的數目為0。當k= 1時,正好存在3個非殘缺的方格,並且這三個方格可用圖1 4 - 4中的某一方向的三格板來覆蓋。

用分而治之方法可以很好地解決殘缺棋盤問題。這一方法可將覆蓋2k×2k 殘缺棋盤的問題轉化為覆蓋較小殘缺棋盤的問題。2k×2k 棋盤乙個很自然的劃分方法就是將它劃分為如圖1 4 - 5 a所示的4個2k - 1×2k - 1 棋盤。注意到當完成這種劃分後, 4個小棋盤中僅僅有乙個棋盤存在殘缺方格(因為原來的2k×2k 棋盤僅僅有乙個殘缺方格)。首先覆蓋其中包含殘缺方格的2k - 1×2k - 1 殘缺棋盤,然後把剩下的3個小棋盤轉變為殘缺棋盤,為此將乙個三格板放在由這3個小棋盤形成的角上,如圖14-5b 所示,其中原2k×2k 棋盤中的殘缺方格落入左上角的2k - 1×2k - 1 棋盤。可以採用這種分割技術遞迴地覆蓋2k×2k 殘缺棋盤。當棋盤的大小減為1×1時,遞迴過程終止。此時1×1的棋盤中僅僅包含乙個方格且此方格殘缺,所以無需放置三格板。

可以將上述分而治之演算法編寫成乙個遞迴的c++ 函式ti l e b o a r d (見程式1 4 - 2 )。該函式定義了乙個全域性的二維整數陣列變數b o a r d來表示棋盤。b o a r d [ 0 ] [ 0 ]表示棋盤中左上角的方格。該函式還定義了乙個全域性整數變數t i l e,其初始值為0。函式的輸入引數如下:

? tr 棋盤中左上角方格所在行。

? tc 棋盤中左上角方格所在列。

? dr 殘缺方塊所在行。

? dl 殘缺方塊所在列。

? size 棋盤的行數或列數。

ti l e b o a r d函式的呼叫格式為ti l e b o a r d(0,0, dr, dc,size),其中s i z e = 2k。覆蓋殘缺棋盤所需要的三格板數目為( s i z e2 -1 ) / 3。函式tileboard 用整數1到( s i z e2-1 ) / 3來表示這些三格板,並用三格板的標號來標記被該三格板覆蓋的非殘缺方格。

令t (k) 為函式ti l e b o a r d覆蓋乙個2k×2k 殘缺棋盤所需要的時間。當k= 0時,s i z e等於1,覆蓋它將花費常數時間d。當k > 0時,將進行4次遞迴的函式呼叫,這些呼叫需花費的時間為4t (k-1 )。除了這些時間外, if 條件測試和覆蓋3個非殘缺方格也需要時間,假設用常數c 表示這些額外時間。可以得到以下遞迴表示式:

程式14-2 覆蓋殘缺棋盤

void tileboard(int tr, int tc, int dr, int dc, int size)

/ /覆蓋右上象限

if (dr < tr + s && dc >= tc + s)

// 殘缺方格位於本象限

ti l e b o a r d ( t r, tc+s, dr, dc, s);

else

/ /覆蓋左下象限

if (dr >= tr + s && dc < tc + s)

// 殘缺方格位於本象限

tileboard(tr+s, tc, dr, dc, s);

else

// 覆蓋右下象限

if (dr >= tr + s && dc >= tc + s)

// 殘缺方格位於本象限

tileboard(tr+s, tc+s, dr, dc, s);

else

}void outputboard(int size)

}可以用迭代的方法來計算這個表示式(見例2 - 2 0),可得t (k )= ( 4k )= (所需的三格板的數目)。由於必須花費至少( 1 )的時間來放置每一塊三格表,因此不可能得到乙個比分而治之演算法更快的演算法。

**自沙大工作室

殘缺的棋盤 數學

題目 i.殘缺的棋盤 在西洋棋裡,王是最重要的乙個棋子。每一步,王可以往上下左右或者對角線方向移動一 步,如下圖所示。給定兩個格仔 a r1,c1 b r2,c2 你的任務是計算出乙個王從 a到 b至少需要走多少步。為了 避免題目太簡單,我們從棋盤裡拿掉了乙個格仔 c r3,c3 abc 保證互不相...

殘缺棋盤問題

殘缺棋盤問題 對於1 1 2 2 4 4 8 8等 2 k 2 k的棋盤來說,都存在乙個任意的位置,而在棋盤剩餘位置都可以用乙個或多個由三個格仔組成的l型直角版覆蓋 那麼如何覆蓋呢?在這裡 採用分而治之的方法來考慮。對於已知的殘缺位置,一定處於當前棋盤的某個象限,那麼在剩下的三個象限中在連線的地方各...

殘缺棋盤問題

殘缺棋盤問題 殘缺棋盤是乙個2 k 2 k個方格的棋盤,其中恰好有乙個方格殘缺,現在要求用三格板覆蓋棋盤,在此覆蓋中兩塊三格板不能重疊,三格板也不能覆蓋在殘缺的方格上。include include include using namespace std const int n 104 int bo...