寫(xiě)在前面
大家好,今天開(kāi)始我將會(huì)在這個(gè)專(zhuān)欄記錄自己每天學(xué)習(xí)Python的心得體會(huì) ,歡迎技術(shù)大牛交流 ,互相學(xué)習(xí)。
問(wèn)題引入:
1至9個(gè)數(shù)字 ,橫豎都有3個(gè)格,怎么使每行、每列兩對(duì)角線上的數(shù)字之和都等與15呢?
算法思路:
(1)九宮格三行三列 ,每一行都是1-9中的3個(gè)數(shù)字。首先從1-9數(shù)字中獲取3個(gè)數(shù)字全排列組合【s1,s2,...,sn】,根據(jù)排列組合知識(shí)可得有9*8*7=504種組合形式;
(2)總共3行,每一行從504個(gè)序列里取一個(gè)數(shù)仿真第一排、第二排、第三排,形成一個(gè)3*3的矩陣;
(3)對(duì)于這個(gè)矩陣,只用判斷行、列、主、副對(duì)角線的和為15就可以解決問(wèn)題。
代碼:
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#@Time :2018/9/19 1:00pm
#@Author:stormwen
#Software:Pycharm
import itertools
count=0
nums=[xfor xin range(1,10)]
sequence_3nums=[pfor pin itertools.permutations(nums,3)if sum(p)==15]
print(sequence_3nums[:5])
for row1_1,row1_2,row1_3in sequence_3nums:
? ? for row2_1, row2_2, row2_3in sequence_3nums:
? ? ? ? for row3_1, row3_2, row3_3in sequence_3nums:
? ? ? ? ? ? if row1_1+row1_2+row1_3==15\
and row2_1+row2_2+row2_3==15\
and row3_1+row3_2+row3_3==15\
and row1_1+row2_1+row3_1==15\
and row1_2+row2_2+row3_2==15\
and row1_3+row2_3+row3_3==15\
and row1_1+row2_2+row3_3==15\
and row1_3+row2_2+row3_1==15:
? ? ? ? ? ? ? ? row1=row1_1,row1_2,row1_3
? ? ? ? ? ? ? row2=row2_1,row2_2,row2_3
if len(set(row1)&set(row2))== 0:
? ? ? ? ? ? ? ? ? ? ? count=count+1
? ? ? ? ? ? ? ? ? ? ? print(20 * "*")
print(row1_1,row1_2,row1_3)
print(row2_1,row2_2,row2_3)
print(row3_1,row3_2,row3_3)
print(count)
結(jié)果展示:
********************
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
注意事項(xiàng):
在編寫(xiě)代碼的過(guò)程中,有一個(gè)細(xì)節(jié)需要主要,如何過(guò)濾重復(fù)矩陣呢?
比如:1 9 5
? ? ? ? ? ?9 5 1
? ? ? ? ? ?5 1 9
小技巧:
? ? ? ? ? ? ?把第一行和第二行都放到集合里面,主要判斷他們的交集長(zhǎng)度為0,則表示他們沒(méi)有交集就可以了
? ? ? ? ? ? ?if len(set(row1)&set(row2))==0:
有人會(huì)問(wèn)了:為什么不是三行比,例如 row1&row2&row3呢?
因?yàn)榍皟尚卸ㄏ聛?lái),最后一行肯定也定了。
好了,感興趣的同學(xué)趕緊運(yùn)行一下代碼吧,會(huì)讓你馬上喜歡上Python這么語(yǔ)言的 。
原創(chuàng)不易 ,如果你覺(jué)得不錯(cuò),點(diǎn)個(gè)關(guān)注吧,留下你的小心心哦 。歡迎志同道合的技術(shù)大神留言交流哦。