九宮格:
九宮格遊戲對人們的思維鍛鍊有著極大的作用,從古時起人們便意識到九宮的教育意義。千百年來影響巨大,在文學、影視中都曾出現過。九宮格最早叫“洛書”,現在也叫“幻方” 。
要求很簡單:
1至9九個數字,橫豎都有3個格,思考怎麼使每行、每列兩個對角線上的三數之和都等於15
算法:
九宮圖的算法有很多種,我們今天講的是最原始的算法,算是暴力破解法
- 九宮格是三行三列,每一行都是1-9中的3個數字,我們先獲取1-9所有的3個數字全排列組合[S1,S2..Sn],差不多有9*8*7=504種
- 這樣的話3行,其實就是每一行從這個504序列裡面取一個放到第一排,第二排,第三排,就形成一個矩陣
- 對這個3*3矩陣,只要判斷行,列,對角線和斜對角線都是15就可以了
是不是很簡單,好我們下面詳細來講一下算法步驟
1.獲取1-9數字的全排列
- Python標準庫中有一個赫赫有名的模塊叫做itertools
- 這模塊提供了很多操作迭代對象的函數,非常方便(以後我們會有文章專門講Python中你必須要知道的模塊)
- 這次我們用itertools裡面的permutations,它可以方便的全排列序列中的數字,每一個組合都是3個數字:比如S1(1,2,3),S2(1,5,8)..這樣我們得到一個長的列表[S1,S2...Sn]
2.列出3*3的矩陣
- 每一行都是48箇中選1個,那麼3行最大的搜索空間就是48*48*48=110592
- 讓電腦運算十幾萬搜索空間只需要幾秒鐘,我們先列出110592個3*3的矩陣
- 怎麼做呢,很簡單,3個for循環搞定:
3.計算行,列,對角線和斜對角線都是15
上面我們已經把這3*3的矩陣列出來了:
row1_1,row1_2,row1_3
row2_1,row2_2,row2_3
row3_1,row3_2,row3_3
只要判斷行,列,對角線和斜對角線都是15就可以了
4.過濾重複的矩陣
這樣我們就可以得到'行,列,對角線和斜對角線都是15'的矩陣,但是這裡面會有重複的元素,比如下面這樣的:
1 9 5
9 5 1
5 1 9
比如第一行是(1,5,9),第二行是(9,5,1)這樣的怎麼過濾呢,簡單我們用集合
把第一行和第二行都放到集合裡面,主要判斷他們的交集長度為0,則表示他們沒有交集就可以了
if len(set(row1)&set(row2))==0:
好了,經過上面的4步就可以很方便的搞定九宮格,其實九宮格就是3階魔方,還有4階的魔方,就是四四格,使橫看豎看斜看均為34,也是類似的,有興趣的同學可以解一下4階的
最後的代碼運行的輸出如下
>>
2 7 6
9 5 1
4 3 8
2 9 4
7 5 3
6 1 8
4 3 8
9 5 1
2 7 6
4 9 2
3 5 7
8 1 6
6 1 8
7 5 3
2 9 4
6 7 2
1 5 9
8 3 4
8 1 6
3 5 7
4 9 2
8 3 4
1 5 9
6 7 2
怎麼樣,是不是覺得很神奇呢?覺得好玩的同學可以關注摳腳小哥哦!私信【學習】還可以免費領取學習資料哦。
閱讀更多 摳腳程序員 的文章