嘿伙计们我正在学习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:它应该有效。 我的程序将其显示为无效。 我有什么想法可以改进我的计划吗? 如果有人好奇,我从programmersheaven.com得到了这个练习题! 谢谢!
答案 0 :(得分:1)
IMO,这个问题非常适合从图遍历开始,所以看看:
https://www.python.org/doc/essays/graphs/
答案 1 :(得分:0)
提示:您的代码将始终拒绝任何不以0结尾的序列。
尝试将验证逻辑实现为根据序列是有效还是无效返回True
或False
的函数,并根据该函数的结果打印验证语句。
修改强>
经过一些进一步的检查,我会尝试给你一些更好的解决方案指导。
如@ a-rodas回答中所述,if 0 in list_of_players
将帮助您检查0是否是序列的一部分。对于其他约束,您可以阅读max()
内置函数,并考虑如何将其用于total
/ len(list_of_players)
。
使用编辑中的这些提示,您应该能够使用简单的if
/ else
语句验证序列(无需任何功能)。为了练习,我没有包含代码示例。但请随意提问,以便我们进一步帮助您找到自己的解决方案。
答案 2 :(得分:0)
len(list_of_players)
永远不会等于总数,因为
range(len(list_of_players))
将创建从停止参数的0
到len(list_of_players)
独占的范围,因此最后一个元素将等于len(list_of_players) - 1
。由于您在循环的每次迭代中将1
添加到total
,total
只会到达len(list_of_players) - 1
并且您的len(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. "