将数字1到9填入下面圆圈里,每个数字只使用一次,使得三角形三条边之和相等。求出所有解。
O
O O
O O
O O O O
这题目怎么解?后来才知道老师靠试的,给出了一个答案。既然靠试,这种苦差事还不如写段小程序来穷举,还能提高孩子学编程的兴趣。
思路是这样的。将所圆圈定义如下:
a0
a1 a8
a2 a7
a3 a4 a5 a6
为了避免重复,令:
a0<a3<a6
a1<a2
a4<a5
a7<a8
开始编程,语言Python
#检查是否重复
def unique(a):
return a[0] < a[3] and a[3] < a[6]\
and a[1] < a[2] and a[4] < a[5]\
and a[7] < a[8]
#验证三边和是否相等
def verify(a):
s = sum(a[6:]) + a[0]
return sum(a[0:4]) == s and sum(a[3:7]) == s
#输出解
def solution(a):
print(' %d' % a[0])
print(' %d %d' % (a[1], a[8]))
print(' %d %d' % (a[2], a[7]))
print('%d %d %d %d' % (a[3], a[4], a[5], a[6]))
print('') # 空一行
#用全排列搜索所有解
from itertools import permutations
n = 0 #解的数量
for a in permutations(range(1, 10)):
if verify(a) and unique(a):
n += 1
print('%d# sum=%d' % (n, sum(a[0:4])))
solution(a)
答案还不少,18个。
1# sum=17
1
5 7
9 6
2 4 8 3
2# sum=19
1
5 8
9 3
4 2 6 7
3# sum=17
1
6 9
8 4
2 5 7 3
4# sum=19
1
6 9
8 2
4 3 5 7
5# sum=20
1
6 7
8 3
5 2 4 9
6# sum=20
2
4 7
9 3
5 1 6 8
7# sum=19
2
5 6
9 4
3 1 8 7
8# sum=20
2
6 9
7 1
5 3 4 8
9# sum=19
2
6 9
8 1
3 4 5 7
10# sum=21
3
2 6
9 4
7 1 5 8
11# sum=20
3
4 9
8 1
5 2 6 7
12# sum=21
3
4 7
8 2
6 1 5 9
13# sum=21
3
5 9
6 1
7 2 4 8
14# sum=21
3
5 8
7 1
6 2 4 9
15# sum=20
4
2 7
9 3
5 1 8 6
16# sum=20
4
3 9
8 1
5 2 7 6
17# sum=23
7
2 4
6 3
8 1 5 9
18# sum=23
7
3 6
5 1
8 2 4 9