如何尝试所有可能的路径?

时间:2015-04-01 13:49:25

标签: python recursion

我需要尝试所有可能的路径,每次达到某一点时都会分支。这个问题有128种可能的路径,因此无需担心指数缩放。

  1. 我有一个可以在场上采取步骤的球员。玩家;选手 迈出了一步,在一个步骤上可能会有一次遭遇。
  2. 找到遭遇时有两种选择:i)输入'B'或ii)输入'G'。
  3. 我想尝试两种方法并继续重复此操作,直到到达字段的末尾。最终目标是尝试所有可能性。
  4. 以下是我在Python中的模板(Step对象使用next()返回下一步):

    from row_maker_inlined import Step
    
    def main():
        initial_stats = {'n':1,'step':250,'o':13,'i':113,'dng':0,'inp':'Empty'}
        player = Step(initial_stats)
        end_of_field = 128
    
        # Walk until reaching an encounter:
        while player.step['n'] < end_of_field:
            player.next()
            if player.step['enc']:
                print 'An encounter has been reached.'
    #           Perform an input on an encounter step:
                player.input = 'B'
    
    #           Make a branch of player?
    #           perform this on the branch:
    #           player.input = 'G'
    #   Keep doing this, and branching on each encounter, until the end is reached.
    

    如您所见,问题相当简单。作为一名初学程序员,我不知道如何解决这样的问题。

    我相信我可能需要使用递归才能保持分支。但我真的只是不明白如何使用递归或其他任何东西“制作分支”。

    我应该关注什么样的解决方案?

1 个答案:

答案 0 :(得分:0)

您应该关注搜索算法,如呼吸优先搜索(BFS)和深度优先搜索(DFS)。

维基百科将此作为BFS的伪代码实现:

  procedure BFS(G, v) is
    let Q be a queue
    Q.enqueue(v)
    label v as discovered
    while Q is not empty
        v← Q.dequeue()
        for all edges from v to w in G.adjacentEdges(v) do
            if w is not labeled as discovered
                Q.enqueue(w)
                label w as discovered

基本上,当您遇到“遭遇”时,您希望在结束时将此点添加到队列中。然后从队列中选择FIRST元素并进行探索,将所有子元素放入队列,依此类推。这是一个非递归的解决方案,它足够简单,可以做你想要的。

DFS类似,但不是从队列中选择FIRST元素,而是选择最后一个。这使得你可以在回到探索另一个之前探索一条到死路的路径。

祝你好运!