求助一道推理题

本文介绍了如何使用Python编写代码解决一个涉及字符串排列组合的问题,通过暴力枚举找出满足特定条件(如位置关系)的答案,尽管指出题目改编不佳,因为它有多个解。
摘要由CSDN通过智能技术生成

怎么用python解决啊?

————————————————————————————————————(分割线)

好了,参照了高手的做法后我也算是写出这道改编题了,代码放在下面,其实思路并不会很难,就是暴力枚举,只是这种获取所有排列组合的函数写法我是真没想到可以这样写,也算是有所收获。最后,我觉得这道题改编地不好,因为这样并没有唯一解,会输出满足条件的多个答案。

# 获取答案的所有排列组合
def get_all_str(str, num):
        if(num == 1):
            for x in str:
                yield x
        else:
            for x in str:
                for y in get_all_str(str, num-1):
                    yield x+y

strKey=['A','B','C','D']
answer_list = []
for x in get_all_str(strKey,10):
    answer_list.append(':'+x)  # 获得所有答案组合,从1开始计数
# 进行运算
x=int(input())
y=int(input())
z=int(input())
for a in answer_list:
    if(a[2] == 'A' and a[5] == 'C') or (a[2] == 'B' and a[5] == 'D') or \
        (a[2] == 'C' and a[5] == 'A') or (a[2] == 'D' and a[5] == 'B'):
        if(a[4] =='A' and a[1]==a[5] and a[x]!=a[y] and a[x]!=a[z] and a[z]!=a[y]) or \
          (a[4] =='B' and a[1]!=a[5] and a[x]==a[y] and a[x]!=a[z] and a[z]!=a[y]) or \
          (a[4] =='C' and a[1]!=a[5] and a[x]!=a[y] and a[x]==a[z] and a[z]!=a[y]) or \
          (a[4] =='D' and a[1]!=a[5] and a[x]!=a[y] and a[x]!=a[z] and a[z]==a[y]):
              if(a[5] =='A' and a[5]==a[8]) or \
                (a[5] =='B' and a[5]==a[4]) or \
                (a[5] =='C' and a[5]==a[9]) or \
                (a[5] =='D' and a[5]==a[7]):
                    if(a[6] == 'A' and a[2]==a[4]==a[8]) or \
                      (a[6] == 'B' and a[1]==a[6]==a[8]) or \
                      (a[6] == 'C' and a[3]==a[10]==a[8]) or \
                      (a[6] == 'D' and a[5]==a[9]==a[8]):
                          if(a[8]=='A' and abs(strKey.index(a[7])-strKey.index(a[1]))!=1) or \
                            (a[8]=='B' and abs(strKey.index(a[5])-strKey.index(a[1]))!=1) or \
                            (a[8]=='C' and abs(strKey.index(a[2])-strKey.index(a[1]))!=1) or \
                            (a[8]=='D' and abs(strKey.index(a[10])-strKey.index(a[1]))!=1):
                                if(a[9]=='A' and (a[1]==a[6]) != (a[6]==a[5])) or \
                                  (a[9]=='B' and (a[1]==a[6]) != (a[10]==a[5])) or \
                                  (a[9]=='A' and (a[1]==a[6]) != (a[2]==a[5])) or \
                                  (a[9]=='A' and (a[1]==a[6]) != (a[9]==a[5])):
                                      num = []
                                      for i in strKey:
                                          num.append(a.count(i))
                                      if(a[7] == 'A' and strKey[num.index(min(num))]=='C') or \
                                        (a[7] == 'B' and strKey[num.index(min(num))]=='B') or \
                                        (a[7] == 'C' and strKey[num.index(min(num))]=='A') or \
                                        (a[7] == 'D' and strKey[num.index(min(num))]=='D'):
                                            if(a[10] == 'A' and (max(num)-min(num))==3) or \
                                              (a[10] == 'B' and (max(num)-min(num))==2) or \
                                              (a[10] == 'C' and (max(num)-min(num))==4) or \
                                              (a[10] == 'D' and (max(num)-min(num))==1):
                                                  print(a[1:])
                          

这就是按题目所给的例子输出的答案,有多个(包含了所给的示例答案) 

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值