在离散课本里,我发现了一个特别有趣的问题,问题如下:
在某班班委成员的选举中,已知王小红、李强、丁金生三位同学被选进了班委会,该班的甲,乙,丙三名学生预言如下:
甲说:王小红为班长,李强为生活委员。
乙说:丁金生为班长,王小红为生活委员。
丙说:李强为班长,王小红为学习委员。
班委会分工名单公布后发现,甲、乙、丙三人都恰好猜对了一半,问:王小红、李强、丁金生各任何职?
哈哈,相信您看了这个问题也很感兴趣吧,下面来和我一起解决这个有趣的问题吧!
首先,我们还是利用一个列表,与以往不同的是,这次列表里装的“123”,这样可以更方便我们来解决这个问题,我们首先定义1代表班长,2代表学习委员,3代表生活委员,不然到后面我们可能都分不清谁是谁了。言归正传,我们还是使用三层循环来决解,同时利用w、li、d来分别代表‘王小红’、‘李强’、‘丁金生’,同时还是将这三个预言转化为三个真值,后面为语言正确的结果,由于结果说每个预言都是一半对一半错,所以我们在真值结果后面用‘or’而不是‘and’,例如第一个预言:王小红为班长,李强为生活委员。由此我们可得w=1或者li=3,转化编程语言就是“w==1 or li==3”,通过这样的形式来限定真值,同理其他两个预言也是这样的方法,只需要保证真值是1并且和题目符合即可,最后我们再利用三个预言的真值都是1,并且他们三个每个人都有一个职位,所以限定条件为“s1+s2+s3=3 并且 w+li+d=6”转化为编程语言就是“s1+s2+s3==3 and w+li+d==6”,这样我们便可以将这个有趣的问题解决了。代码结果如下:
ls=[1,2,3]
#1是班长,2是学习委员,3是生活委员;
#w是王小红,li是李强,d是丁金生
for w in ls:
for li in ls:
for d in ls:
s1=(w==1or li==3)
s2=(d==1or w==3)
s3=(li==1or w==2)
if(s1+s2+s3==3 and w+li+d==6):
print("w:{},li:{},d:{}".format(w,li,d))
# 1是班长,2是学习委员,3是生活委员;
# w是王小红,li是李强,d是丁金生
#结果为王小红是学委,李强是生活委员,丁金生是班长
由代码的运行结果可知王小红是学习委员、李强是生活委员、丁金生是班长。
希望这个有趣的问题可以让您感兴趣呢,谢谢您的观看,真诚地希望我的过程对您有帮助!