📅  最后修改于: 2023-12-03 15:28:45.306000             🧑  作者: Mango
本文将介绍题目“门(GATE-CS-2017(Set 2)|第65章)”,讨论这道题目相关的知识点和解题方法。
有一扇门和两位守卫。第一位守卫要么总是诚实,要么总是说谎;第二位守卫则总是交替说谎和说真话。你不知道守卫的身份,也不知道他们在门前的站位。你可以问他们任意一个守卫一个问题,以确定哪扇门通向目标房间,可是门的位置是守卫不会告诉你的。门只会在开启它的时候传送你到目标房间。确定哪扇门是正确的需要通过对守卫回答的问题进行推理。下列问题其中一个可以直接告诉你哪扇门是正确的:
下列问题中,通过它的答案可以推断哪扇门是正确的,却无法确定守卫的身份:
下列问题对于确定哪扇门是正确的没有任何帮助:
首先,我们要确定哪些守卫说谎,哪些说真话。假设第一个守卫说真话,那么无论哪扇门是正确的,他都会告诉你。如果他是说谎的,那么他会指向错误的门。因此,第一个守卫说谎。
接下来,我们需要确定第二个守卫的身份。他的回答交替在“说谎”和“说真话”之间,因此我们可以提出“如果您是说真话,哪扇门是正确的?”来判断。如果他是说真话,他会告诉你正确的门。如果他是说谎的,他会指向错误的门。
现在我们已经知道两个守卫至少一个说谎。因此,我们可以解决第一个问题。问第一个守卫:“如果我问第二个守卫哪扇门是正确的,他会怎么回答?”如果第一位守卫说谎,他会指向错误的门。因此,我们只需要选择指向另一扇门的门即可。如果第一位守卫说真话,我们可以选择他所指向的门。
第二个问题则没有直接答案。因为我们不知道第一个守卫的身份,所以无法预测他会如何回答。
下面是代码片段,展示了如何用Python实现以上算法:
def get_valid_door():
# Ask guard 2 which door is correct
door = 2
for i in range(2):
if not is_guard_telling_truth(2, door):
door = 1 if door == 2 else 2
# Ask guard 1 whether guard 2 would tell the truth
if is_guard_telling_truth(1, door):
return door
# Door pointed to by guard 1 is incorrect, choose other door
return 1 if door == 2 else 2
def is_guard_telling_truth(guard, door):
if guard == 1:
return door == 2
else:
return not (door == 1) == (guard_told_truth_by_turn(2) % 2 == 0)
def guard_told_truth_by_turn(guard):
return guard + (target_door - 1) * 2
target_door = int(input("Enter target door (1 or 2): "))
print("Valid door is: ", get_valid_door())
代码实现了前文描述的算法。其中,get_valid_door()
函数在两个守卫告诉你两扇门中只有一个是正确的前提下,返回正确的门的编号。is_guard_telling_truth()
函数确定给定守卫是否在告诉你正确的门。guard_told_truth_by_turn()
函数返回指定守卫在此之前回答真或假的次数。最后,我们简单的读入目标门的编号,调用get_valid_door()
函数,并输出结果。
以上就是本文的介绍,在代码片段中,我们展示了如何用Python解决这道题目。