1

我正在尝试解决这个问题:CodeEval

这个问题需要我浏览 XY 坐标中可能的候选点列表。然后,如果他们满足要求,我将它们添加到“已确认”列表中,然后将周围的点添加到“tosearch”列表中。然而,这根本不像我期望的那样表现。

示例代码:

Starting point
tosearch=[[0,0]] 

for point in tosearch:

    if conditions filled:
        confirmed.append(point)
        #Basically Im trying to add (x,y-1) etc. to the tosearct list
        tosearch.append([point[0],point[1]-1])  #1 
        tosearch.append([point[0]+1,point[1]])  #2
        tosearch.append([point[0]-1,point[1]-1])#3
        tosearch.append([point[0],point[1]+1])  #4
        tosearch.remove(point)
else:
     tosearch.remove(point)

这似乎导致总是忽略一半的附加。所以在这种情况下 #1 和 #3 被忽略。如果我只留下 1&2 那么只有 2 会执行。我不明白...

也许问题出在其他地方所以这里是整个代码: Pastebin

4

2 回答 2

5

您在迭代集合时正在修改集合。
2个选项:

  1. 复制列表,迭代副本并更改原始列表。
  2. 跟踪需要进行哪些更改,并在迭代后全部更改。
于 2012-07-16T18:53:26.180 回答
0

问题是您正在tosearch迭代的循环体中进行修改tosearch。由于tosearch是变化的,它不能可靠地迭代。

您可能根本不需要迭代。只需使用一个while循环:

searched = set() # if you need to keep track of searched items
tosearch = [(0,0)] #use tuples so you can put them in a set
confirmed = []

while tosearch:
    point = tosearch.pop()
    searched.add(point) # if you need to keep track
    if CONDITIONS_MET:
        confirmed.append(point)
        # tosearch.append() ....
于 2012-07-16T19:04:32.243 回答