課上老師留了個九宮格問題,今天把我的心得記錄下,希望能和諸君相互學習
九宮格問題:
正常用枚舉法會很麻煩,需要計算9!次,而且每次都要有各種判斷,及其繁瑣,下面給出我的優化及解法:
1、如圖所示,設1-9個格子所填數據爲a1至a9,設每列,每行,斜着的和爲x
則三行相加爲:3x=a1+a2+……+a9=1+2+……+9=45,所以x=15,即每一行、每一列、斜着的和均爲15;
2、第二行、第二列、兩個斜方向相加爲:4 * 15=a1+a2+……+a9+3*a5=45+3*a5,即a5=5;中間數必是5;
3、設a1=i;a2=j;a3=k;a4=l;因爲a5=5,則由涉及到a5的行列斜可計算:a6=10-l;a7=10-k;a8=10-j;a9=10-i;那麼進行判定
的時候凡是涉及a5的均可以不考慮了;
4、計算可知行a1+a2+a3與a7+a8+a9是重複的,本質上都是i+j+k=15;同理列a1+a4+a7與a3+a6+a9也是重複的,均可
化爲i+l+10-k=15;最後只要判定這兩個條件相等即可。
5、注意:每個數字不能相等,即i,j,k,l10-i,10-j,10-k,10-l均不相等且不等於5;
6、優化,現在的計算次數爲8*7*6*5,但是i<5的時候10-i爲大於5的情況,兩個是對稱的沒必要再計算,只需要算出i<5
的情況再倒過來就是兩種情況,這樣計算次數爲4*7*6*5;
7、代碼如下圖
結果是
不知道大家發現沒有,雖說是有八種,但是出去中心變換,即倒着打印的四種還只剩下四種,而有趣的是剩下四種也不是
純粹的四種,第三個是第一個行變成列,在矩陣上叫做轉置,第五個又是第一個的第三行和第一行交換,而第七個又是第
五個的轉置,所以本質上來說其實只有一種。是不是有些意思?