数码管亮灯问题
一个数码管,分为七段字符,统计可以组成多少种连续图形(即亮灯的字符必须相邻)
注意:在此题中没有dp段字符
解题思路
在这里我们为了方便,可以将字符的编码按顺序依次定义为数字1,2,3,4,5,6,7的形式
(1)可以直接通过手算。
拿草稿纸直接列出所有的可能性,然后看他不同亮灯情况下分别有多少种,最后求和,但是这样做需要特别细心
例如
亮一个灯:有1,2,3,4,5,6,7这7种形式
亮两个灯:有12,16,23,27,34,37,45,56,57,67这10种形式
亮三个灯:123,126,127,156,167,234,237,257,267,345,347,357,367,456,457,567这16种
亮四个灯:有1234,1236,1237,1256,1257,1267,1367,1456,1567,2345,2347,2357,2367,2457,2567,3456,3457,3467,3567,4567这20种
亮五个灯:直接数亮五个灯很容易输错,可以反过来数灭两个灯的,注意其他的灯是连续的即可,有12,13,14,15,16,17,23,24,25,27,34,36,37,45,46,47,56,57,67这19种
亮六个灯:数灭一个灯的,很容易知道是1,2,3,4,5,6,7这7种
全亮:一种
所以共有7+10+16+20+19+7+1=80种
(2)依然是手算,但可以通过编程辅助运算
通过程序列出所有的组合,然后一次对数码管的字符进行验算
import itertools # itertools为python标准库,可以正常使用
sum = 0
a = [i for i in range(1, 8)]
for i in itertools.combinations(a, 2):
print(i)
sum += 1
print('有%d种' % sum)
combinations(a,r)函数可以实现如同高中数学中的有序组合一样可以对a中的元素进行全组合,r为抽取的个数,上述代码中函数为C(2,7)=(76)/(21)=21
因此,通过修改combinations()函数的参数即可将不同亮灯情况的组合全部打印出来,然后进行验算即可,相对来说不容易出错
此题还有其他解法,等后边学习到了再进行补充
本文如有不足之处,欢迎大家指正,一起交流,谢谢!