1. 程式人生 > >棋盤完美覆蓋數(小規模原理實現)

棋盤完美覆蓋數(小規模原理實現)

### 前言: 最近在看組合數學,記錄一些書中相關的知識點。 --- ### 正文: 考慮一個普通的國際象棋棋盤,它被分成8\*8(8行8列)的64個正方形。設有形狀一樣的多米諾骨牌,每張牌恰好覆蓋棋盤上相鄰的兩個方格(即1\*2的骨牌)。那麼能否把32個這樣的1*2骨牌放到棋盤上,使得任何兩張牌均不重疊,每張多米諾骨牌覆蓋兩個方格,並且棋盤上所有的方格都被覆蓋住?我們把這樣一種排列稱為被多米諾骨牌的完美覆蓋。這是一個簡單的排列問題,人們能夠很快構造許多不同的完美覆蓋。但是計算不同的完美覆蓋的總數就不是一件容易的事了,不過,這還是有可能做到的。這個數由 M.E.Fischer在其一篇名為Statistical Mechanics of Dimers on a Plane Lattice的論文中計算出了不同的完美覆蓋總數為: 12988816 = 24 * (901)2 。而後Fischer得出了更一般的公式用來求解1*2骨牌覆蓋m\*n(m,n至少一個為偶數)方格的公式, ![](https://gitee.com//riotian/blogimage/raw/master/img/20200823213834.jpeg) 。其實這就是分子生物學著名的二聚物問題。 分析完上面的問題,大家自然會有一個問題,對於一般的1\*b的方格來覆蓋m\*n的棋盤,完美覆蓋數又是多少呢?這裡,我們稱1\*b的方格為b-牌(b-omino)。一個已知的事實是,如果一個m\*n的棋盤擁有b牌的完美覆蓋,那麼b是m的一個因子或者b是n的一個因子。本文將給出03的情況。其實我們注意到b=2,應該能夠考慮到二進位制,繼而考慮到狀態壓縮動態規劃。首先dfs出相鄰兩行的狀態轉移方式$S_{from}->S_{to}$,繼而用動態規劃轉移得到每行的方案數Hs。不難看出時間複雜度為O(m\*2n)。菜魚同學利用特徵方程計算了每行的方案數Hs=![](https://gitee.com//riotian/blogimage/raw/master/img/20200823213911.jpeg),由於第二項較小可以忽略,因此Hs約等於0.85\*2.414n,即2n