九个数代表着九宫格中的九个位置
a | b | c |
d | e | f |
g | h | i |
对于九宫格的性质, 假如九宫格的总和为M,则
e=M/9, 且任意某行或者某列的和为3e
任意给定九个数,我们可以先进行判断是否符合满足九宫格的前提条件,将此九个数从小到大排序排序,验证其如下的性质
- 总和M能否被9整除,整除获得的数是否在这九个数之中(最终符合的话 为上图中的e)
- 如上图的九宫格 a+i=c+g=b+h=d+f=2e, 除了e之外的另8个数两 两结合成加法对; 此时的4个加法对分别是 最大值与最小值相加;第二 大与第二小的数值相加....... 如果不这样,假如是最大值与第二小的值相 加,那么肯定存在一个加法对,其包含了最小值和另外一个数,这个加法对 无论如何小于最大值与第二小值相加的和,不满足条件(所有值相等的情 况除外)
满足了上面两个条件,就满足了的组成九宫格的基本条件,再按九宫格的口诀进行数字的填写及验证,详细的代码见如下
'''
整体思路:
对给定的列表排序
判断是否满足组成九宫格的基本条件
满足后按'二,四为肩,六,八为足。上九下一,左七右三'进行填充二维列表,并做进一步的判断
'''
def list_confirmation(li):
# 使用冒泡排序法对列表进行排序
for i in range(len(li)-1):
for j in range(len(li)-i-1):
if li[j]>li[j+1]:
li[j],li[j+1]=li[j+1],li[j]
# 组成九宫格的基本条件判断,文档中有说明
if sum(li) % 9 == 0 and sum(li) / 9 == li[int((len(li) - 1) / 2)]:
# 满足了基本信息,接下来进行九宫格的填充后的判断,将九个数字放在一个二维的列表中
new_li = [[li[1], li[8], li[3]],
[li[6], li[4], li[2]],
[li[5], li[0], li[7]]]
sum_li = []
for i in range(8):
sum_li.append(0)
for j in range(3):
sum_li[0] += new_li[0][j]
sum_li[1] += new_li[1][j]
sum_li[2] += new_li[2][j]
sum_li[3] += new_li[j][0]
sum_li[4] += new_li[j][1]
sum_li[5] += new_li[j][2]
sum_li[6] += new_li[j][j]
sum_li[7] += new_li[j][2 - j]
if sum_li[0] == sum_li[1] == sum_li[2] == sum_li[3] == sum_li[4] == sum_li[5] == sum_li[6] == sum_li[7]:
print('成功')
else:
print('失败')
else:
print('失败')
if __name__ == '__main__':
# 此处修改 li进行测试,能组成九宫格返回成功,否则返回失败
li=[2,4,6,8,10,12,18,16,14]
list_confirmation(li)