04 - 到底要跟谁结婚?
本帖最后由 鱼C-小师妹 于 2021-4-8 08:07 编辑在线视频:
https://www.bilibili.com/video/BV1HT4y1K7DY?p=6
掌握上一讲说的“盒图”,绝对让你开发能力如虎添翼~
(没看上一讲的,请戳:传送门)
当然,光脑子学会还不行,一定要重复训练,毕竟“实践是检验真理的唯一标准”
来,安排:
有三对情侣要结婚,假设三位靓仔分别为 A、B、C,三位小仙女为 X、Y、Z。他们三对情侣比较皮,准备让吃瓜路小由鱼来猜!
小由鱼搞不清谁和谁结婚,所以去询问了这六位新人中的三位,得到的回答为:
A 说他要和 X 结婚
X 说她的未婚夫是 C
C 说他要和 Z 结婚
听到这样的回答后,小由鱼知道他们都是在开玩笑,说的都是假话,但他仍搞不清谁和谁结婚。
现在请编程求出到底哪位谁要和谁结婚。
是不是有点绕?
如果你懂了,可以暂停视频去写代码,直接看最后来对答案。
有点懵的童鞋,请继续看,小师妹带大家抽丝剥茧理清思路。
童鞋们请问:
前几节课我们都用什么方法来暴力破解问题呢?
没错还是:
**** Hidden Message *****
设三个变量 x、y 和 z 分别表示与 X,Y,Z 结婚的靓仔。
它们可能取值都是:A,B,C
定义一个 boy 列表来存放他们,如下:
boy = ['A','B','C']
其中 boy 的值就是 A 以此类推。
根据问题分析中我们可以推导出如下结论:
[*]x!='A' ——A 的新娘不是 X
[*]x!='C' —— 与 X 结婚的不是 C
[*]z!='C' —— C 的新娘不是 Z
[*]x!=y ——与 X 结婚的不会与 Y 结婚
[*]x!=z ——与 X 结婚的不会与 Z 结婚
[*]y!=z ——与 Y 结婚的不会与 Z 结婚
将上面的判断依据组合起来,找到变量 x、y 和 z 所满足的条件。
如何组合,就是将上面的条件用 and 来组成最终的判断条件:
x != boy and x != boy and z != boy and x != y and x != z and y != z
找到上面的条件以后,我们就可以在程序中使用三重循环来穷举 x、y 和 z 的所有取值。
满足上述条件的 x 值、y 值和 z 值就是我们要的答案喽。
盒图部分也很简单,你们先暂停自己画下,然后对比一样吗:
好啦,图有了,代码就近在眼前(核心):
for x in boy:
for y in boy:
for z in boy:
if x != boy and x != boy and z != boy and x != y and x != z and y != z:
print("结果为:")
print("X与{}结婚\nY与{}结婚\nZ与{}结婚".format(x, y, z))
结果:
源码(不建议下载):
本帖最后由 Daniel_Zhang 于 2021-3-21 17:14 编辑
import itertools
list1 = ['A', 'B', 'C']
list2 = ['X', 'Y', 'Z']
# 迭代循环,生成所有的可能性,只循环 list1 的内容,list2 固定
for each in itertools.permutations(list1):
count = 0 # 计算配对成功的数量
for position in range(len(each)): # 排列后的结果和 list2 对应的位置一一比对
if (list2 == 'X' and each == 'A') or (list2 == 'X' and each == 'C') or (list2 == 'Z' and each == 'C'):
break
else:
count += 1
if count == len(list1):# 全部符合条件,打印输出并退出程序
print(each)
for result in range(len(each)):
print(each, '==>', list2)
break
Daniel_Zhang 发表于 2021-3-21 17:10
嘘!{:10_336:} 11 {:10_256:}{:10_256:} boy = ['A','B','C']
girl = [ for X in boy for Y in boy for Z in boy if Z != Y and Z != X and Y != X]
for x in girl:
if boy != x and x != boy and boy != x:
print(f'X和{x}结婚, Y和{x}结婚, Z和{x}结婚')
Daniel_Zhang 发表于 2021-3-21 17:10
X=['A','B','C']
for x in X:
for y in X:
for z in X:
if x!=X and x!=X and z!=X and x!=y and x!=z and y!=z:
print('X---',x,';Y---',y,';Z---',z) boy=["A","B","C"]
for X in boy:
for Y in boy:
for Z in boy:
if X!=boy and X!=boy and Z!=boy and X!=Y and X!=Z and Y!=Z:
print("X=",X,"Y=",Y,"Z=",Z)
for B in ['X', 'Y', 'Z'] for C in ['Y'] if A != B != C != A] {:5_109:} for x in boy:
for y in boy:
for z in boy:
if x != boy and x != boy and z != boy and x != y and x != z and y != z:
print("结果为:")
print("X与{}结婚\nY与{}结婚\nZ与{}结婚".format(x, y, z)) 穷举法 谢谢小师妹 11 # 题干:有三对情侣要结婚,假设三位靓仔分别为 A、B、C,三位小仙女为 X、Y、Z。他们三对情侣比较皮,准备让吃瓜路小由鱼来猜!
# A 说他要和 X 结婚
# X 说她的未婚夫是 C
# C 说他要和 Z 结婚
# male = ['A', 'B', 'C']
# female = ['X', 'Y', 'Z']
# 假设男性结婚的对象为 a, b, c
# a!=X and c!=X and c!=Z --> 可以推断 c == Y & a == Z(无语。。。写条件过程中推出来了。。。)
female = ['X', 'Y', 'Z']
for a in female:
for b in female:
for c in female:
if (a!=b) and (b!=c) and (c!=a):
if (a!='X') and (c!='X') and (c!='Z'):
print('A的结婚对象是:%s\nB的结婚对象是:%s\nC的结婚对象是:%s' % (a,b,c))
else:
pass 这都能编程?! boy =['A','B','C']
for x in boy:
for y in boy:
if x != y:
for z in boy:
if x != z and y != z and x != boy and x != boy and z != boy:
print('X:{}\nY:{}\nZ:{}'.format(x,y,z)) check 沙发 小由鱼hhhh
页:
[1]
2