Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 树捕获的问题,在哪里放置另一个球员的最大分数_Algorithm_Data Structures_Binary Tree - Fatal编程技术网

Algorithm 树捕获的问题,在哪里放置另一个球员的最大分数

Algorithm 树捕获的问题,在哪里放置另一个球员的最大分数,algorithm,data-structures,binary-tree,Algorithm,Data Structures,Binary Tree,给定一个二叉树。两个玩家在玩一个游戏,每次两个玩家同时捕获所有相邻节点。 当没有玩家可以捕获更多节点时,游戏结束并计算结果 如果玩家捕获了相邻节点,则所有这些节点都被视为该玩家的节点 给定player1的节点,player2应放置在何处,以便player2获得最大数量的节点 如果存在共同邻居的问题,考虑没有人捕获它。 我在网上搜索,没有找到任何类似的问题 游戏开始时你可以把它看作一个森林。 < P>如果我正确地理解了规则,那么将第二个玩家放在第一个玩家节点附近的一个节点上是有意义的。 因为图是一

给定一个二叉树。两个玩家在玩一个游戏,每次两个玩家同时捕获所有相邻节点。 当没有玩家可以捕获更多节点时,游戏结束并计算结果

如果玩家捕获了相邻节点,则所有这些节点都被视为该玩家的节点

给定player1的节点,player2应放置在何处,以便player2获得最大数量的节点

如果存在共同邻居的问题,考虑没有人捕获它。

我在网上搜索,没有找到任何类似的问题


游戏开始时你可以把它看作一个森林。

< P>如果我正确地理解了规则,那么将第二个玩家放在第一个玩家节点附近的一个节点上是有意义的。 因为图是一棵树,所以每个内部节点都是一个连接点:通过捕获这样一个节点,图实际上分裂成了断开连接的图。因此,当有两个玩家在场时,一个玩家只能到达另一个玩家生成的一个断开连接的图中的节点

让我们假设player1位于一个内部节点上,有两个子节点和一个父节点。因此,该播放器将图形划分为三个断开连接的图形:左子树、右子树,最后是可以从父节点(但不是通过播放器的节点)访问的所有节点

另一个玩家只能放在这三个图形中的一个。第一个玩家可以自由访问另外两个。第二个玩家不可能在那里有影响力。因此,这意味着最好将第二个玩家放在三个断开连接的图中最大的一个。在这个断开连接的图中选择节点很简单:选择第一个玩家可以直接访问的节点,这样他们甚至不能进入那个断开连接的图。第二个玩家因此拥有这棵树,并且可以完全捕获它

因此,一个可能的算法需要得到与玩家节点相邻的三个断开连接的图的大小。首先定义使用简单的递归算法获取子树的大小:

函数getSizeTreeroot: 如果root==NIL: 返回0 其他: 返回1+getSizeTreeroot.left+getSizeTreeroot.right 然后,对于树的给定根和放置第一个player1的节点,我们可以确定player2的最佳选择,如下所示:

函数getBestForPlayer2root,player1: sizeAll=getTreeSizeroot sizeLeft=getTreeSizeplayer1.left SizerRight=getTreeSizeplayer1.right sizeParent=sizeAll-sizeLeft-sizeRight-1 maxSize=maxsizeLeft、SizerRight、sizeParent 如果sizeLeft==maxSize: player2=root.left 否则,如果sizeParent==maxSize: player2=root.parent 其他: player2=root.right 返回播放器2
这个问题不是很清楚;是否每次都意味着球员没有轮流上场?它们捕获的节点是什么?关于允许捕获哪些节点,是否有任何规则,或者玩家是否可以继续捕获和重新捕获相同的节点?请尝试对其进行编辑,以便更清楚地描述问题,并询问有关问题的具体信息。@kaya3它们同时捕获所有相邻节点。也编辑了问题。你没有回答卡娅提出的所有问题。在抓取所有邻居后,玩家的位置在哪里?他们第二次搬家时,邻居被认为是什么?还是只有一步?捕获节点时,是否将其从树中移除,使其成为林?玩家占用的节点是否被认为已被抓获。。。等等。这个问题缺乏很多规范。@trincot它需要进一步编辑吗?我们可以进一步选择它吗?我不认为,但面试官告诉我要进一步优化它。不。您至少需要访问所有节点来计算它们,除非您的树包含这样的额外信息。该算法只访问一次节点。它具有线性时间复杂度。