def ad(a, b, k):
if len(b) >= 4 and b[0]+b[1]+b[2]+b[3] != 34:
return k
elif len(b) >= 7 and b[0] + b[1] + b[2] + b[3] != b[0] + b[4] + b[5] + b[6]:
return k
elif len(b) >= 9 and b[0] + b[1] + b[2] + b[3] != b[3] + b[7] + b[8] + b[6]:
return k
elif len(b) >= 11 and b[0] + b[1] + b[2] + b[3] != b[4] + b[9] + b[7] + b[10]:
return k
elif len(b) >= 12 and b[0] + b[1] + b[2] + b[3] != b[1] + b[9] + b[8] + b[11]:
return k
elif len(b) >= 14 and b[0] + b[1] + b[2] + b[3] != b[5] + b[8] + b[12] + b[13]:
return k
elif len(b) >= 15 and b[0] + b[1] + b[2] + b[3] != b[2] + b[7] + b[12] + b[14]:
return k
elif len(b) >= 16 and (b[0] + b[1] + b[2] + b[3] != b[6] + b[11] + b[14] + b[15] or b[0] + b[1] + b[2] + b[3] != b[0] + b[9] + b[12] + b[15]):
return k
elif len(b) == 16:
print(b,k)
k += 1
for i in range(len(a)):
b.append(a[i])
d = a.pop(i)
k = ad(a, b, k)
a.insert(i, d)
b.pop(-1)
return k
a = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
b = [1]
k = ad(a, b, 0)
print(k)
流程图再研究下,先简单说明一下原理:
import time
def ad(a, b, k):
# print(a,b) #如果不能理解,把这两行注释打开,看一下运行过程
# time.sleep(1)
if len(b) >= 4 and b[0]+b[1]+b[2]+b[3] != 34: #第一行,只有满足第行和为34,才进行下一个判断
return k
elif len(b) >= 7 and b[0] + b[1] + b[2] + b[3] != b[0] + b[4] + b[5] + b[6]: #第一列
return k
elif len(b) >= 9 and b[0] + b[1] + b[2] + b[3] != b[3] + b[7] + b[8] + b[6]: #右上到左下的斜线
return k
elif len(b) >= 11 and b[0] + b[1] + b[2] + b[3] != b[4] + b[9] + b[7] + b[10]: #第二行
return k
elif len(b) >= 12 and b[0] + b[1] + b[2] + b[3] != b[1] + b[9] + b[8] + b[11]: #第二列
return k
elif len(b) >= 14 and b[0] + b[1] + b[2] + b[3] != b[5] + b[8] + b[12] + b[13]: #第三行
return k
elif len(b) >= 15 and b[0] + b[1] + b[2] + b[3] != b[2] + b[7] + b[12] + b[14]: #第三列
return k
elif len(b) >= 16 and (b[0] + b[1] + b[2] + b[3] != b[6] + b[11] + b[14] + b[15] or b[0] + b[1] + b[2] + b[3] != b[0] + b[9] + b[12] + b[15]): #第四行和左上到右下的斜线
return k
elif len(b) == 16:
print(b,k)
k += 1
for i in range(len(a)):
b.append(a[i]) #从列表a中依次取数字尝试放入b中
d = a.pop(i) #记录放入b中的数字
k = ad(a, b, k) #递归测试
a.insert(i, d) #如果取出来放入b中的数字测试不合适,则重新放回a
b.pop(-1) #同时将新添加到b中的数字取出
return k
a = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16] #列表a表示未使用的数字
b = [1] #列表b代表已使用的数字,且有固定的顺序
k = ad(a, b, 0)
print(k)
列表b中数字对应的位置示意
def ad(a, b, k):
if len(b) >= 4 and b[0]+b[1]+b[2]+b[3] != 34: //b数组元素大于等于4个时,第一行是不是总和等于34,如果不等就返回K值
return k
elif len(b) >= 7 and b[0] + b[1] + b[2] + b[3] != b[0] + b[4] + b[5] + b[6]: //b数组元素大于等于7个时,判断两组数组和是不是相等,相当于第一行和第一列的和是不是相等
return k
elif len(b) >= 9 and b[0] + b[1] + b[2] + b[3] != b[3] + b[7] + b[8] + b[6]: //b数组元素大于等于9个时,判断两组数组和是不是相等,相当于判断第一行和右斜行的和数是不是相等
return k
elif len(b) >= 11 and b[0] + b[1] + b[2] + b[3] != b[4] + b[9] + b[7] + b[10]: //b数组元素大于等于11个时,判断两组数组和是不是相等,相当于判断第一行和第二行的和数是不是相等
return k
elif len(b) >= 12 and b[0] + b[1] + b[2] + b[3] != b[1] + b[9] + b[8] + b[11]://b数组元素大于等于12个时,判断两组数组和是不是相等,相当于判断第一行和第二列的数是不是相等
return k
elif len(b) >= 14 and b[0] + b[1] + b[2] + b[3] != b[5] + b[8] + b[12] + b[13]://b数组元素大于等于14个时,判断两组数组和是不是相等,相当于判断第一行和第三行的和数是不是相等
return k
elif len(b) >= 15 and b[0] + b[1] + b[2] + b[3] != b[2] + b[7] + b[12] + b[14]://b数组元素大于等于15个时,判断两组数组和是不是相等,相当于判断第一行和第三列的和数是不是相等
return k
elif len(b) >= 16 and (b[0] + b[1] + b[2] + b[3] != b[6] + b[11] + b[14] + b[15] or b[0] + b[1] + b[2] + b[3] != b[0] + b[9] + b[12] + b[15])://b数组元素大于等于16个时,判断两组数组和是不是相等,相当于判断第一行和第四行和左斜行的和数是不是相等
return k
elif len(b) == 16:
print(b,k)
k += 1
for i in range(len(a)):
b.append(a[i]) //从数组a中第i数数值放到数组b的尾部
d = a.pop(i) //a中pop第i数值
k = ad(a, b, k) //计算各行理值是否相等,如果相等就中k加1
a.insert(i, d) //把取出的d值放回a数组
b.pop(-1) //b数组的最后一个数取出
return k
a = [2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16]
b = [1]
k = ad(a, b, 0)
print(k)
这个有点复杂