确定谁在遍历游戏中获胜的算法

时间:2019-02-14 13:03:33

标签: python algorithm recursion graph geography

我们将使用图表和两个参与者。在此连接图中,获胜条件是第二位玩家没有其他可采取的途径。要注意的是,一旦玩家选择了一条路径,就不能再次使用。

让我们假设初始输入为邻接列表(x,y)表示x具有到y的路径

目标是返回玩家1可以选择的一组顶点,以使其始终获胜。

例如,如果我有[(1,2), (2,0), (0, 3), (3,2)]并且玩家1开始,那么我们应该返回[1, 0, 3]。我们无法返回2

2->玩家1从这里开始

(2,0)->播放器2变为0

(0,3)->玩家1进入3

(3,2)->玩家2进入2

(2,0)->玩家1无法进入此处,已经被占领

already_visited = []

turn = 1

result = []

def findStarting(L):
    global already_visited
    global turn
    global result

    for x,y in L:
        allowed = can_visit(L, y) # function tell me which I can visit safely

        turn = (turn % 2) + 1 # increment the turn

        already_visited.append((x,y)) # we visited this edge

        res = findStarting([(x, y)]) # recursive call (search on this node for paths)


    if (turn == 2): return True

def can_visit(L, y): 
    res = []
    for a,b in L: if (a==y and (a,b) not in already_visited): res.append((a,b))
    return res

我遇到了递归问题。我想我想做的就是返回True,如果我们到达转弯为2且玩家无路可走的地方,但是我不确定如何从这里前进

enter image description here

1 个答案:

答案 0 :(得分:0)

这是一个简单的递归解决方案。它效率不高,它是蛮力搜索,没有任何中间状态的缓存,因此尽管我不知道是否有解决此问题的有效方法(即非指数方法),但绝对可以使其速度更快。

def firstPlayerWins(g,v):
  for i,e in enumerate(g):
    if e[0]==v and not firstPlayerWins(g[:i]+g[i+1:],e[1]):
        return True
  return False

def winningVertices(g):
  return [v for v in set(e[0] for e in g) if firstPlayerWins(g,v)]

winningVertices([(1,2), (2,0), (0, 3), (3,2)])
## [0, 2, 3]