鱼C-小师妹 发表于 2021-3-21 16:24:50

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:10:45

本帖最后由 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

鱼C-小师妹 发表于 2021-3-22 09:32:13

Daniel_Zhang 发表于 2021-3-21 17:10


嘘!{:10_336:}

fb1996 发表于 2021-4-9 15:07:00

11

q1243231608 发表于 2021-6-10 09:06:54

{:10_256:}{:10_256:}

zhangyuesd 发表于 2021-6-21 14:18:45

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}结婚')

mzxmzx 发表于 2021-7-6 20:48:09

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)

兔飞飞 发表于 2021-9-16 19:32:21

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)

傻眼貓咪 发表于 2021-10-17 19:24:52

for B in ['X', 'Y', 'Z'] for C in ['Y'] if A != B != C != A]

kcyyyy 发表于 2021-10-22 20:03:21

{:5_109:}

specail 发表于 2021-10-26 18:29:44

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))

纯水货 发表于 2021-11-26 22:37:38

穷举法

aironeng 发表于 2021-12-1 16:20:49

谢谢小师妹

lonelyclown 发表于 2022-4-2 09:25:55

11

Hyjxsssss 发表于 2022-5-3 21:51:54

# 题干:有三对情侣要结婚,假设三位靓仔分别为 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

pu-007 发表于 2022-8-24 20:22:21

这都能编程?!

语与余 发表于 2022-11-13 22:35:46

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))

xier00 发表于 2023-3-13 16:57:48

check

Alexiiis 发表于 2023-5-30 22:17:27

沙发

yinda_peng 发表于 2023-5-31 08:18:11

小由鱼hhhh
页: [1] 2
查看完整版本: 04 - 到底要跟谁结婚?