为什么我的Java Memo数组会被初始化为0?

3

备忘录数组被重新初始化为0

我不明白为什么我的备忘录数组在初始化为-1后又被设为0,即使它一直重置到了0。下面的代码一直在调用自身,但是在堆栈的第一层中,备忘录会被初始化为0。

import java.util.Arrays;

public class RGBTree {
    public static void main(String[] args) {
        RGBTree rgb = new RGBTree();
        String[] G =
                {"..B.BB...RB..","......R..B.G.",
                        "B.......BB...",".......R...G.",
                        "B....GRB..R..","B...G.RG.R...",
                        ".R..RR..B.RB.","...RBG...G...",
                        "..B...B......","RBB..R.G....R",
                        "B...R.R......",".G.G..B.....R",".........R.R."};
        System.out.println(rgb.exist(G));

    }


    public String exist(String[] G) {
        int[][][][]  memo = new int[(1 << 13)][13][13][13];
        int n = G.length;
        int k = (n - 1) / 3;
        for (int i = 0; i < 1 << 13; i++) {
            for (int j = 0; j < 13; j++) {
                for (int l = 0; l < 13; l++) {
                    for (int m = 0; m < 13; m++) {
                        memo[i][j][k][l] = -1;
                    }
                }
            }
        }


        return (f(n, 1, k, 0, 0, 0, G, memo)) ? "Exist" : "Does not";

    }

    private boolean f(int v, int mask, int k, int r, int g, int b, String[] graph, int[][][][]memo) {

        boolean res = false;
        if (memo[mask][r][g][b] != -1) {
            res = memo[mask][r][g][b] == 1 ? true : false;
        } else {
            if (r == k && g == k && b == k) {
                res = true;
            }
            for (int i = 0; i < v; i++) {
                if (((mask & (1 << i)) == 1)) {
                    for (int j = 0; j < v; j++) {
                        if ((mask & (1 << j)) == 0 && graph[i].charAt(j) != '.') {
                            int nr = r, ng = g, nb = b;
                            char c = graph[i].charAt(j);
                            switch (c) {
                                case 'R':
                                    nr++;
                                    break;
                                case 'G':
                                    ng++;
                                    break;
                                case 'B':
                                    nb++;
                                    break;

                            }


                            if (nr <= k && ng <= k && nb <= k) {
                                res |= f(v, mask | (1 << j), k, nr, ng, nb, graph, memo);
                            }
                        }

                    }
                }
            }
            memo[mask][r][g][b] = res ? 1 : 2;

        }
        return res;

    }
}
1个回答

1
你的循环索引是 ijlm,但在初始化时使用了 ijkl。由于 k 在循环中不会改变,因此你没有初始化 memo 中的每个元素。你可以这样做:
int[][][][] memo = new int[(1 << 13)][13][13][13];
for (int i = 0; i < memo.length; i++) {
    for (int j = 0; j < memo[i].length; j++) {
        for (int l = 0; l < memo[i][j].length; l++) {
            Arrays.fill(memo[i][j][l], -1);
        }
    }
}

哇,我花了好几个小时才找出我的错误在哪里,并感到困惑。我非常感谢您的回复,现在它可以工作了,谢谢。 - Giovani Salazar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接