【问题标题】:How to Trim a General Tree of Tic Tac Toe Boards - Java Recursion如何修剪井字游戏板的一般树 - Java 递归
【发布时间】:2019-03-22 16:36:48
【问题描述】:

我试图让每个父节点(每个节点)向我展示它的子树有多少胜负。

这将允许我玩一台计算机,以便计算机可以通过转到 O 获胜最多的下一个子树来优化其移动。

现在我正在尝试重新排列树,以便它可以简单地告诉我它的子树有多少胜利和失败。

到目前为止,我有一棵经过排序的树,共有 9 代。

1) 第一代有 8 个兄弟姐妹(每个都有子节点)或 X 的 8 个可能移动。

2) 第二代有 7 个兄弟姐妹(每个都有子节点)或 O 的 7 个可能移动。

3) 一直持续到最后一代的兄弟姐妹为零和一个完整的董事会。

4) 我有 986410 个可能的(完整的和不完整的)板。

此方法当前打印整个树中所有可能获胜的次数(对于 X 和 O)。但是,它会使树节点的数量增加一倍,当它应该少于原始数量时,因为并非所有节点都获胜。

public void postOrderTraverse(TreeNode T) {

        counter++;

        if (T == null) {
            return;
        } else {

            postOrderTraverse(T.firstChild);
            postOrderTraverse(T.nextSibling);

            // checks diagonals, horizontals and verticals for a set of X's or O's
                if (winOrProgress(T.board, X) == true || winOrProgress(T.board, O) == true) {

                    // prints the game board at this node
                    char[][] gameBoard = T.board;
                    for (int i = 0; i < 3; i++) {
                        for (int j = 0; j < 3; j++) {
                            char value = gameBoard[i][j];
                            System.out.print(value);
                        }
                    }
                    T.firstChild = T;
                    System.out.print(counter);
                    System.out.println("Win");
                }

            }
    }

【问题讨论】:

    标签: java recursion tree tic-tac-toe


    【解决方案1】:

    您在调用之后放置计数器,它将计算所有节点,甚至是空节点。 将其更改为在 else 语句中。但这只是你问题的一部分。这将正确计算所有节点,而不仅仅是获胜者。如果您只想计算获胜节点,则需要将其放入该 catch 而不是 else。

    public void postOrderTraverse(TreeNode T) {
    
    
        if (T == null) {
            return;
        } else {
             counter++;  //this is where you need to put counter, not before the actual call that way you are not counting null nodes. which you would be adding at most 2 nodes for every node that doesn't have any children.
    
    
            postOrderTraverse(T.firstChild);
            postOrderTraverse(T.nextSibling);
    

    【讨论】:

    • 但是从您的代码中,您没有正确检查是否有获胜者,或者我没有正确读取您的循环,因为您没有标记为获胜的哨兵值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多