0

嘿伙计们,我正在学习 python,我被困在这个问题上。我已经尝试过了,但我的输出不符合正确答案。有什么原因以及如何解决它?

问题:刺客游戏是一个在大学校园里玩的简单游戏,每个玩家只需对他们说“你死了”就被分配了一个暗杀目标。当然,校园里有成千上万的人,而游戏中只有几十人,你永远不知道谁想要暗杀你。一旦你暗杀了一个人,你就会找到他们正在寻找的目标。如果这恰好是你,那么你就是赢家。为确保其正常工作,目标必须形成一个连续的“链”。编写一个程序,允许用户输入他们的目标分配,并根据是否存在连续的“链”输出它是否有效。列表中的每个人都由列表中的位置表示。该位置的价值是他们的目标。

我的代码:

total=0
list_of_players=[]
player=raw_input("Enter a player (end to stop): ")

while player !="end":
    list_of_players.append(int(player))

    player=raw_input("Enter a player (end to stop): ")

for x in range(len(list_of_players)):
    total+=1
    if list_of_players[x]==0 and len(list_of_players)==total:
        print "The game is valid."
if list_of_players[x]!=0 or len(list_of_players)!=total:
    print "The game is not valid. "

问题是如果我输入玩家 4,3,0,5,6,2,1:它应该是有效的。我的程序将此显示为invalid。有什么想法可以改进我的程序吗?如果有人好奇,我从programmersheaven.com 得到了这个练习题!谢谢!

4

3 回答 3

1

IMO,这个问题非常适合从图遍历开始,所以看看:

https://www.python.org/doc/essays/graphs/

  • 从第一项开始
  • 如果您最终回到第一项并且访问了所有节点,tadaaa :)
于 2013-04-21T20:42:15.960 回答
0

提示:您的代码将始终拒绝任何不以 0 结尾的序列。

尝试将您的验证逻辑实现为返回TrueFalse基于序列是有效还是无效的函数,并根据该函数的结果打印验证语句。

编辑

经过进一步检查,我将尝试为您提供一些更好的解决方案指导提示。

正如@a-rodas answer中所述,if 0 in list_of_players将帮助您检查 0 是否是序列的一部分。对于另一个约束,您可以阅读max()内置函数并考虑如何将它用于您的total/ len(list_of_players)

使用编辑中的这些提示,您应该能够使用简单的if/else语句验证序列(不需要函数)。为了练习,我没有包含代码示例。但请随时提出问题,以便我们进一步帮助您找到自己的解决方案。

于 2013-04-21T20:22:57.327 回答
0
len(list_of_players)

永远不会等于总数,因为

range(len(list_of_players))

将创建一个范围 from0len(list_of_players) 排除stop 参数,因此最后一个元素将等于len(list_of_players) - 1. 由于您在循环的每次迭代中添加,1只会达到并且您的条件将永远不会得到满足。totaltotallen(list_of_players) - 1len(list_of_players)==total

但是,您也没有检查它是否是一个链,在示例中4-> 6-> 1-> 3-> 5-> 2-> 0->4这是一个有效的链,您需要检查它。选择任何索引开始。保留一组您已经看过的物品,如果您在到达起始元素之前遇到您已经看过的物品,则链条不是连续的。

total=0
list_of_players=[]
player=raw_input("Enter a player (end to stop): ")

while player !="end":
    list_of_players.append(int(player))

    player=raw_input("Enter a player (end to stop): ")

seen = set() # this could also be seen = [] but sets are faster
i = 0 # index to start at

# we should be able to go through len(list_of_players)
# before reaching the start player
for x in range(len(list_of_players)): 
    if i in seen:
        print "the game is not valid. "
        break
    seen.add(i)
    i = list_of_players[i]
else: # successful completion, no breaks
    print "The game is valid. "
于 2013-04-22T00:04:53.537 回答