流程图再研究下,先简单说明一下原理:
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中数字对应的位置示意
流程图: