三階幻方python解法

2021-10-04 19:09:57 字數 2448 閱讀 6683

三階幻方:1-9共9個數字填入九宮格中,九宮格中間元素為5,各行、列、對角線元素相加和為15。求解出所有符合條件的排列。

python解法1:由於九宮格中間元素已確定,剩下元素中選擇乙個數填入tmp[0][0],再選擇乙個數填入tmp[0][1],則剩下元素都可根據已填元素確定,通過兩層巢狀迴圈實現。

lst = [1,2,3,4,5,6,7,8,9]

reslt =

tmp = [0] * 9

tmp[4] = 5

for i,j in enumerate(lst):

#row = i//3

#col = i%3

tmp[0] = lst[i]

tmp[8] = 10-tmp[0]

sublst = [i for i in lst if i not in tmp]

for k in sublst:

tmp[1] = k

#如果求的元素值重複,則返回-1

tmp[2] = 15-tmp[0]-tmp[1] if 15-tmp[0]-tmp[1] not in tmp else -1

tmp[6] = 10-tmp[2] if 10-tmp[2] not in tmp else -1

tmp[3] = 15-tmp[6]-tmp[0] if 15-tmp[6]-tmp[0] not in tmp else -1

tmp[5] = 15-tmp[2]-tmp[8] if 15-tmp[2]-tmp[8] not in tmp else -1

tmp[7] = 10-tmp[1] if 10-tmp[1] not in tmp else -1

#有重複元素則跳出本次迴圈

errors = [ x for x in tmp if x<1]

if len(errors) >0:

#清空所求元素值

tmp[1],tmp[2],tmp[6],tmp[3],tmp[5],tmp[7] = [0]*6

continue

print(tmp)

# 清空所求元素值

tmp[1], tmp[2], tmp[6], tmp[3], tmp[5], tmp[7] = [0]*6

解法二:1.找出所有九位數的全排列,判斷每個排列是否滿足三階幻方的條件。

# 1-9個數放入3*3九宮格 行、列、對角和為15

#遞迴,下降二叉樹

def perm(lis,begin,end):

#print "呼叫perm函式"

if begin>=end:

col1 = [j for i,j in enumerate(lis) if i%3 == 0]

col2 = [j for i,j in enumerate(lis) if i%3 == 1]

col3 = [j for i, j in enumerate(lis) if i % 3 == 2]

row1 = lis[0:3]

row2 = lis[3:6]

row3 = lis[6:9]

#符合行、列、對角和為15,且中間元素值為5

if(lis[4]==5 and sum(col1)==15 and sum(col2)==15 and sum(col3)==15 and\

sum(row1)==15 and sum(row2)==15 and sum(row3)==15):

for i,j in enumerate(lis):

if i%3 ==2:

print(j)

print('— — —')

else:

print(j,end='|')

print('********************==')

else:

i = begin

for num in range(begin,end):

# 固定當前位置,在進行下一位的排列

lis[num],lis[i] = lis[i],lis[num]

#print "-----num:%d,begin:%d"%(num,begin)

perm(lis,begin+1,end)

#呼叫結束之後還需要回溯將交換位置的元素還原,以供其他下降路徑使用(二叉樹)

lis[num],lis[i] = lis[i],lis[num]

lis = [1,2,3,4,5,6,7,8,9]

reslt =

perm(lis,0,len(lis))

print(len(reslt),"種排列滿足條件")

結果:

三階幻方(回溯)

題目 時限 1000ms 記憶體限制 10000k 總時限 3000ms 描述三階幻方是最簡單的幻方,又叫九宮格,是由1,2,3,4,5,6,7,8,9九個數字組成的乙個三行三列的矩陣,其對角線 橫行 縱向的的和都為15。輸入無 輸出按字典序輸出所有的滿足條件的幻方矩陣,每兩個數字之間帶乙個空格,行...

三階幻方(暴力破解)

小明最近在教鄰居家的小朋友小學奧數,而最近正好講述到了三階幻方這個部分,三階幻方指的是將1 9不重複的填入乙個3x3的矩陣當中,使得每一行 每一列和每一條對角線的和都是相同的。三階幻方又被稱作九宮格,在小學奧數里有一句非常有名的口訣 二四為肩,六八為足,左三右七,戴九履一,五居其中 通過這樣的一句口...

N(奇數)階幻方解法

3階8 1635 7492 5階17241 815235 714164 6132022 1012 1921311 182529 include includeusing namespace std const int n 9 定義階數,當前9階 該演算法只適合奇數階幻方 int main int a...