三階幻方: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...