棋盤覆蓋問題詳解

2021-10-05 11:08:29 字數 1218 閱讀 9089

每個棋盤裡面有乙個特殊方格,邊長為2^k ,棋盤大小為4^k

下圖為乙個4x4的特殊棋盤

用l型的骨牌覆蓋棋盤上除特殊方格的部分,共需要(4^k-1)/3個l型骨牌

下圖為四種覆蓋型別

看到上圖,大家對大概思路有了一定想法——就是把除了特殊方格所在的1/4大方格以外其他的3個大方格進行最靠中心的乙個單元的覆蓋,這可以使非特殊大方格特殊化,以達到遞迴過程的統一性。隨著大方格的邊長不斷減半,我們將一直得到更小的範圍內的特殊方格。直到邊長為1時,我們便可以直接返回,從另外一種情況進行遞迴(仍是邊長從大到小),直到棋盤上所有情況都遞迴到。

由於遞迴過程中每個大方塊裡面有且僅有乙個特殊方格,所以肯定會滿足l型覆蓋的擺放。

void

chessboard

(int tr,

int tc,

int dr,

int dc,

int size)

/*tr,tc最左上角行號列號 dr,dc特殊方格行號列號 size為邊長*/

/*覆蓋右上角棋盤*/

if(dr

=tc+s)

/*特殊方格在右上角的範圍內*/

chessboard

(tr,tc+s,dr,dc)

/*對此特殊方格進行展開遞迴*/

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

}

棋盤覆蓋問題

source code include include include using namespace std const int n 1024 int board n n count void cover int sx,int sy,int cx,int cy,int size,int cx1,i...

棋盤覆蓋問題

問題 在乙個2k 2k k 0 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為特殊方格。顯然,特殊方格在棋盤中可能出現的位置有4k種,因而有4k種不同的棋盤,圖4.10 a 所示是k 2時16種棋盤中的乙個。棋盤覆蓋問題 chess cover problem 要求用圖4.10 b 所示...

棋盤覆蓋問題

棋盤覆蓋問題 time limit 1000ms,special time limit 2500ms,memory limit 32768kb total submit users 103,accepted users 40 problem 10432 no special judgement pr...