鱼C论坛

 找回密码
 立即注册
查看: 9604|回复: 21

[技术交流] 04 - 到底要跟谁结婚?

[复制链接]
发表于 2021-3-21 16:24:50 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 鱼C-小师妹 于 2021-4-8 08:07 编辑

在线视频:


掌握上一讲说的“盒图”,绝对让你开发能力如虎添翼~
(没看上一讲的,请戳:传送门

当然,光脑子学会还不行,一定要重复训练,毕竟“实践是检验真理的唯一标准”

来,安排:

有三对情侣要结婚,假设三位靓仔分别为 A、B、C,三位小仙女为 X、Y、Z。他们三对情侣比较皮,准备让吃瓜路小由鱼来猜!
小由鱼搞不清谁和谁结婚,所以去询问了这六位新人中的三位,得到的回答为:
A 说他要和 X 结婚
X 说她的未婚夫是 C
C 说他要和 Z 结婚
听到这样的回答后,小由鱼知道他们都是在开玩笑,说的都是假话,但他仍搞不清谁和谁结婚。
现在请编程求出到底哪位谁要和谁结婚。

是不是有点绕?

如果你懂了,可以暂停视频去写代码,直接看最后来对答案。

有点懵的童鞋,请继续看,小师妹带大家抽丝剥茧理清思路。

童鞋们请问:

前几节课我们都用什么方法来暴力破解问题呢?

没错还是:

游客,如果您要查看本帖隐藏内容请回复


设三个变量 x、y 和 z 分别表示与 X,Y,Z 结婚的靓仔。

它们可能取值都是:A,B,C

定义一个 boy 列表来存放他们,如下:
boy = ['A','B','C']

其中 boy[0] 的值就是 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[0] and x != boy[2] and z != boy[2] and x != y and x != z and y != z
找到上面的条件以后,我们就可以在程序中使用三重循环来穷举 x、y 和 z 的所有取值。

满足上述条件的 x 值、y 值和 z 值就是我们要的答案喽。

盒图部分也很简单,你们先暂停自己画下,然后对比一样吗:

盒图.jpg

好啦,图有了,代码就近在眼前(核心):
 for x in boy:
        for y in boy:
            for z in boy:
                if x != boy[0] and x != boy[2] and z != boy[2] and x != y and x != z and y != z:
                    print("结果为:")
                    print("X与{}结婚\nY与{}结婚\nZ与{}结婚".format(x, y, z))
结果:
2021-03-23_09-38-47.jpg

源码(不建议下载): matchGroom.py.zip (767 Bytes, 下载次数: 15, 售价: 6 鱼币)

评分

参与人数 3荣誉 +12 鱼币 +3 贡献 +9 收起 理由
bool想学C + 5 + 3 鱼C有你更精彩^_^
睦ちゃん她爹 + 5 + 3 鱼C有你更精彩^_^
不二如是 + 2 + 3 + 3 鱼C有你更精彩^_^

查看全部评分

本帖被以下淘专辑推荐:

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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[position] == 'X' and each[position] == 'A') or (list2[position] == 'X' and each[position] == 'C') or (list2[position] == 'Z' and each[position] == 'C'):
            break
        else:
            count += 1
    if count == len(list1):  # 全部符合条件,打印输出并退出程序
        print(each)
        for result in range(len(each)):
            print(each[result], '==>', list2[result])
        break
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2021-3-22 09:32:13 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-4-9 15:07:00 | 显示全部楼层
11
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-10 09:06:54 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-6-21 14:18:45 | 显示全部楼层
boy = ['A','B','C']
girl = [[X,Y,Z] 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[0] != x[0] and x[0] != boy[2] and boy[2] != x[2]:
        print(f'X和{x[0]}结婚, Y和{x[1]}结婚, Z和{x[2]}结婚')

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-7-6 20:48:09 | 显示全部楼层

X=['A','B','C']
for x in X:
    for y in X:
        for z in X:
            if x!=X[0] and x!=X[2] and z!=X[2] and x!=y and x!=z and y!=z:
                print('X---',x,';  Y---',y,';  Z---',z)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[2] and X!=boy[0] and Z!=boy[2] and X!=Y and X!=Z and Y!=Z:
                print("X=",X,"Y=",Y,"Z=",Z)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-17 19:24:52 | 显示全部楼层
[print(('A', A), ('B', B), ('C', C)) for A in ['Y', 'Z'] for B in ['X', 'Y', 'Z'] for C in ['Y'] if A != B != C != A]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-10-22 20:03:21 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-26 18:29:44 | 显示全部楼层
for x in boy:
        for y in boy:
            for z in boy:
                if x != boy[0] and x != boy[2] and z != boy[2] and x != y and x != z and y != z:
                    print("结果为:")
                    print("X与{}结婚\nY与{}结婚\nZ与{}结婚".format(x, y, z))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-11-26 22:37:38 | 显示全部楼层
穷举法
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-1 16:20:49 | 显示全部楼层
谢谢小师妹
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-2 09:25:55 | 显示全部楼层
11
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 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
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-8-24 20:22:21 | 显示全部楼层
这都能编程?!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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[0] and x != boy[2] and z != boy[2]:
                    print('X:{}\nY:{}\nZ:{}'.format(x,y,z))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-3-13 16:57:48 | 显示全部楼层
check
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-5-30 22:17:27 | 显示全部楼层
沙发
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-5-31 08:18:11 | 显示全部楼层
小由鱼hhhh
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-23 05:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表