分治演算法 棋盤覆蓋

2022-03-12 13:02:32 字數 1731 閱讀 6398

問題描述

在乙個2^k×2^k 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤。在棋盤覆蓋問題中,要用圖示的4種不同形態的l型骨牌覆蓋給定的特殊棋盤上除特殊方格以外的所有方格,且任何2個l型骨牌不得重疊覆蓋。

解題思路

分析:當k>0時,將2k×2k棋盤分割為4個2^k-1×2^k-1 子棋盤(a)所示。特殊方格必位於4個較小子棋盤之一中,其餘3個子棋盤中無特殊方格。為了將這3個無特殊方格的子棋盤轉化為特殊棋盤,可以用乙個l型骨牌覆蓋這3個較小棋盤的會合處,如 (b)所示,從而將原問題轉化為4個較小規模的棋盤覆蓋問題。遞迴地使用這種分割,直至棋盤簡化為棋盤1×1。(出自演算法設計與分析-王曉東)

實現:每次都對分割後的四個小方塊進行判斷,判斷特殊方格是否在裡面。這裡的判斷的方法是每次先記錄下整個大方塊的左上角(top left coner)方格的行列座標,然後再與特殊方格座標進行比較,就可以知道特殊方格是否在該塊中。如果特殊方塊在裡面,這直接遞迴下去求即可,如果不在,這根據分割的四個方塊的不同位置,把右下角、左下角、右上角或者左上角的方格標記為特殊方塊,然後繼續遞迴。在遞迴函式裡,還要有乙個變數s來記錄邊的方格數,每次對方塊進行劃分時,邊的方格數都會減半,這個變數是為了方便判斷特殊方格的位置。其次還要有乙個變ncount來記錄l型骨牌的數量。

**實現:

#include #include 

int ncount = 0

;int matrix[100][100

];void chessboard(int tr, int tc, int dr, int dc, int

size);

intmain()

printf("\n

");}

return0;

}void chessboard(int tr, int tc, int dr, int dc, int

size)

else

//locate the special grid on bottom left corner

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

else

//locate the special grid on top right corner

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

else

//locate the special grid on top left corner

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

else

}2013/6/14 22:30

程式結果:

棋盤覆蓋問題 分治演算法

演算法日誌記錄pta 在乙個2 k 2 k k為正整數,k 10,length 2 k 個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格 其座標為aa,bb,分別代表行座標號和列座標號 以及有四種l型骨牌 如下圖 求用若干塊這種l型骨牌實現除該特殊點棋盤的全覆蓋。本題要求採用分治...

分治 棋盤覆蓋

題目描述 在乙個2 k 2 k個方格組成的棋盤中,若恰有乙個方格與其它方格不同,則稱該方格為一特殊方格,稱改棋盤為一特殊棋盤。顯然特殊方格在棋盤上出現的位置有4 k種情形。因而對任何k 0,有4 k種不同的特殊棋盤。下圖所示的特殊棋盤為k 2時16個特殊棋盤中的乙個。在棋盤覆蓋問題中,要用下圖中4中...

棋盤覆蓋 分治

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