c
codeye
V1
2022/09/22阅读:20主题:默认主题
2个人说谎,2人说真话
函数statement(person) 运用字典结构初始化每个人的申明:
values是包含2个元素的列表, 角标位置为 0 :此人说谎 角标位置为 1: 此人说真话
输出 字典结构sates.keys是['A','B','C','D']
def statement(person):
states = dict(zip(person,[]*len(person)))
states['A'] = ['A',['B','C','D']]
states['B'] = [['A','B','C'],"D"]
states['C'] = [['A','C','D'],"B"]
states['D'] = ['D',['A','B','C']]
return states
person = ['A','B','C','D']
print(statement(person))
主函数 find(state, true_man) 函数find传入参数state是子函数statement返回结果 缺省true_man时,则返回所有遍历结果
def find(state, true_man):
enum = range(int('0b0000',2),int('0b1111',2)+1)
status = ['{:0>4}'.format(bin(i)[2:]) for i in enum]
key = list(state.keys())
ans = {}
for elem in status:
sets = set(state[key[0]][int(elem[0])])
for i, c in enumerate(elem):
sets &= set(state[key[i]][int(c)])
ans[elem] = set(sets)
return [[k,v] for k,v in ans.items() if len(v)]
states = statement(person,states={})
print(find(states,true_man=1))
[['0001', {'A'}], ['1001', {'C'}],
['1011', {'B'}], ['1100', {'D'}]]
输出结果又一次支持结论:已知只有一个人说真话的前提下,只有['0001', {'A'}符合
再看若有2个人说谎,2人说真话,那么 窃贼只会在'C'和‘D'之间的某一个;
再看若有1个人说谎,3人说真话,那么 窃贼只能是'B'
作者介绍
c
codeye
V1