c語言演算法

來源:互聯網
上載者:User

殘缺棋盤(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 表示這些額外時間。可以得到以下遞迴運算式:

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.