九宮格用Python怎么破-14行代碼搞定(九宮格拼圖python代碼)
- 前面我陸陸續(xù)續(xù)寫了30多篇講了很多Python知識點:字符串,列表,字典,循環(huán),函數(shù), 模塊,文件,異常等等,這么多知識,如何靈活運用呢
- 我覺得說千遍道萬遍,不如敲一遍,于是我準備寫一些Python的趣味編程的小例子,后面會陸續(xù)寫給大家
- 挑的例子一定要有趣而且簡單,適合初學者上手,通過實戰(zhàn)的小例子,可以讓初學者綜合運用Python的知識點
- 在完成編程的同時也能發(fā)現(xiàn)Python之美,增加學習Python的樂趣
九宮格:
九宮格游戲?qū)θ藗兊乃季S鍛煉有著極大的作用,從古時起人們便意識到九宮的教育意義。千百年來影響巨大,在文學、影視中都曾出現(xiàn)過。九宮格最早叫“洛書”,現(xiàn)在也叫“幻方” 。
要求很簡單:
1至9九個數(shù)字,橫豎都有3個格,思考怎么使每行、每列兩個對角線上的三數(shù)之和都等于15
算法:
九宮圖的算法有很多種,我們今天講的是最原始的算法,算是暴力破解法
- 九宮格是三行三列,每一行都是1-9中的3個數(shù)字,我們先獲取1-9所有的3個數(shù)字全排列組合[S1,S2..Sn],差不多有9*8*7=504種
- 這樣的話3行,其實就是每一行從這個504序列里面取一個放到第一排,第二排,第三排,就形成一個矩陣
- 對這個3*3矩陣,只要判斷行,列,對角線和斜對角線都是15就可以了
是不是很簡單,好我們下面詳細來講一下算法步驟
1.獲取1-9數(shù)字的全排列
- Python標準庫中有一個赫赫有名的模塊叫做itertools
- 這模塊提供了很多操作迭代對象的函數(shù),非常方便(以后我們會有文章專門講Python中你必須要知道的模塊)
- 這次我們用itertools里面的permutations,它可以方便的全排列序列中的數(shù)字,每一個組合都是3個數(shù)字:比如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循環(huán)搞定:
3.計算行,列,對角線和斜對角線都是15
上面我們已經(jīng)把這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:
好了,經(jīng)過上面的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
原文地址:https://dwz.cn/X2I8h3nF
作者:菜鳥學Python