考慮乙個普通的西洋棋棋盤,它被分成8*8(8行8列)的64個正方形。設有形狀一樣的多公尺諾骨牌,每張牌恰好覆蓋棋盤上相鄰的兩個方格(即1*2的骨牌)。那麼能否把32個這樣的1*2骨牌放到棋盤上,使得任何兩張牌均不重疊,每張多公尺諾骨牌覆蓋兩個方格,並且棋盤上所有的方格都被覆蓋住?我們把這樣一種排列稱為被多公尺諾骨牌的完美覆蓋。這是乙個簡單的排列問題,人們能夠很快構造許多不同的完美覆蓋。但是計算不同的完美覆蓋的總數就不是一件容易的事了,不過,這還是有可能做到的。,
這個數由m.e.fischer在其一篇名為statistical mechanics of dimers on a plane lattice的**中計算出了不同的完美覆蓋總數為:
12988816 = 2^4 * 901^2
.而後fischer得出了更一般的公式用來求解1*2骨牌覆蓋m*n(m,n至少乙個為偶數)方格的公式:
其實這就是分子生物學著名的二聚物問題。
分析完上面的問題,大家自然會有乙個問題,對於一般的1*b的方格來覆蓋m*n的棋盤,完美覆蓋數又是多少呢?這裡,我們稱1*b的方格為b-牌(b-omino)。乙個已知的事實是,如果乙個m*n的棋盤擁有b牌的完美覆蓋,那麼b是m的乙個因子或者b是n的乙個因子。本文將給出0
1)b=1 的情況
顯然,覆蓋方法數只有1種
2)b=2的情況
前面提到了fischer的三角公式,但是有個問題,如果結果很大的時候,需要給出取模解的時候,用公式就顯得力不從心了。
i)而我們發現當n=2的時候,結果數剛好是fibonacci數列。對於m較大可以用矩陣冪演算法解決。
ii)n=3的時候可以推倒出遞推式:
以及邊界條件:
其中am
代表在左上角將第一塊骨牌橫著放的總方案數,b
m代表在左上角豎著放第一塊骨牌的方案數。
不難得出a
m的表示式,繼而使用矩陣冪求出大資料求模的解。周源在wc08的講稿中給出了am和b
m的生成函式:
iii) n>3的情況。其實我們注意到b=2,應該能夠考慮到二進位制,繼而考慮到狀態壓縮動態規劃。首先dfs出相鄰兩行的狀態轉移方式s(from)->s(to),繼而用動態規劃轉移得到每行的方案數hs。不難看出時間複雜度為o(m*2n)。菜魚同學利用特徵方程計算了每行的方案數
hs=由於第二項較小可以忽略,因此hs約等於0.85*2.414n,即2n
3) b=3的情況或者b=4的情況
均可以利用上述推倒遞推關係的方法求解。
小規模 b牌棋盤完美覆蓋數 整理
小規模 b牌棋盤完美覆蓋數 農夫三拳 seu drizzlecrj gmail.com 考慮乙個普通的西洋棋棋盤,它被分成8 8 8行8列 的64個正方形。設有形狀一樣的多公尺諾骨牌,每張牌恰好覆蓋棋盤上相鄰的兩個方格 即1 2的骨牌 那麼能否把32個這樣的1 2骨牌放到棋盤上,使得任何兩張牌均不重...
棋盤覆蓋問題
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個方格組成的棋盤中,恰有乙個方格與其他方格不同,稱該方格為一特殊方格,且稱該棋盤為一特殊棋盤,顯然特殊方格在棋盤上出現的位置有4k種情形。因而對任何k 0,有4k種不同的特殊棋盤。特殊方格必位於4個較小子棋盤之一中,其餘3個子棋盤中無特殊方格。為了將這3個無特殊方格的子棋盤轉化為特殊...