三阶幻方python解法

三阶幻方: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),"种排列满足条件")

结果:

  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值