我正在尝试生成一个决策树,它将显示在一个TreeView中。这是一个足球游戏开发者的界面。它将允许用户向特定节点添加事件。我遇到的问题是生成所有的节点。当使用链接列表时,可以共享节点,其中路径交叉,但这不能在TreeView中使用,因为节点会被混淆。我在这里有一幅图像:
正如你所知,足球是一种球门事件游戏,一旦进球,我就进入树中的下一个节点。所以0-0的分数是起点。然后,该节点分裂为2个节点(1-0)和(0-1)。一旦上了一条路,树就需要迎合沿着这条路行驶的需要,但也要满足2-2,3-2,3-3等的需求。
因此,树中的每个节点都需要包含上一个分数的所有可能的解决方案。我相信你会明白的。
递归的最大得分或退出点定义为:(Home + Away) <8
我用: Recurse(rootNode,0,0)调用递归例程;
函数CreateNodeFromScore完成了奇特的节点创建,并且工作非常出色。
我的递归代码在这里:
private void Recurse(TreeNode node, int iHome, int iAway) {
if ((iHome + iAway) == 8 ) {
return;
}
node.Nodes.Add( CreateNodeFromScore(iHome, iAway) );
TreeNode nextNode = node.Nodes[0];
Recurse(nextNode, ++iHome, iAway);
Recurse(nextNode, iHome, ++iAway);
}
private void CreateNodeFromScore(int iHome, int iAway) {
return new TreeNode(iHome.ToString() + " - " + iAway.ToString());
}
我已经尝试了很多方法来实现这个目标,但是这个解决方案却让我无法理解。
这是一个算法问题,而不是gui、treeview或C#、C++问题。代码可以在两种语言之间直接翻译。
有什么能帮到我吗?
发布于 2017-10-16 10:37:50
我将在这里回答我自己的问题,因为我已经找到了答案。有趣的是,在这里发帖帮助我重新思考了这个问题,因为我觉得我很困惑。我感谢@dbc给我的建议和建议。
private void Recurse(TreeNode node, int iHome, int iAway) {
if ((iHome + iAway)> 7)
return;
var homeNode = CreateNodeFromScore(iHome +1, iAway);
var awayNode = CreateNodeFromScore(iHome, iAway + 1);
node.Nodes.Add(homeNode);
node.Nodes.Add(awayNode);
Recurse(homeNode, iHome +1, iAway);
Recurse(awayNode, iHome, iAway +1);
}
产生这一结果:
https://i.imgur.com/ztnbRDA.png
我希望这可能对其他人有用。
安德里亚
https://stackoverflow.com/questions/46758490
复制相似问题