Python還能這麼玩?-14行代碼搞定九宮格,就是這麼炫酷!

九宮格:

九宮格遊戲對人們的思維鍛鍊有著極大的作用,從古時起人們便意識到九宮的教育意義。千百年來影響巨大,在文學、影視中都曾出現過。九宮格最早叫“洛書”,現在也叫“幻方” 。

要求很簡單:

1至9九個數字,橫豎都有3個格,思考怎麼使每行、每列兩個對角線上的三數之和都等於15

Python還能這麼玩?-14行代碼搞定九宮格,就是這麼炫酷!

算法:

九宮圖的算法有很多種,我們今天講的是最原始的算法,算是暴力破解法

  • 九宮格是三行三列,每一行都是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]
Python還能這麼玩?-14行代碼搞定九宮格,就是這麼炫酷!

2.列出3*3的矩陣

  • 每一行都是48箇中選1個,那麼3行最大的搜索空間就是48*48*48=110592
  • 讓電腦運算十幾萬搜索空間只需要幾秒鐘,我們先列出110592個3*3的矩陣
  • 怎麼做呢,很簡單,3個for循環搞定:
Python還能這麼玩?-14行代碼搞定九宮格,就是這麼炫酷!


3.計算行,列,對角線和斜對角線都是15

上面我們已經把這3*3的矩陣列出來了:

row1_1,row1_2,row1_3

row2_1,row2_2,row2_3

row3_1,row3_2,row3_3

只要判斷行,列,對角線和斜對角線都是15就可以了

Python還能這麼玩?-14行代碼搞定九宮格,就是這麼炫酷!

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

怎麼樣,是不是覺得很神奇呢?覺得好玩的同學可以關注摳腳小哥哦!私信【學習】還可以免費領取學習資料哦。


分享到:


相關文章: