三阶幻方: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
reslt.append(tmp)
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):
reslt.append(lis)
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),"种排列满足条件")
结果: