将一维数组[81]转换为多维数组[9] [9](数独求解器)

时间:2014-09-07 23:48:36

标签: java arrays multidimensional-array

我最近开始制作一个数独求解器。求解器本身已经完成并且工作得很好,但我发现了一个问题。我的解算器基于存储数独游戏棋盘编号的2D阵列。 阵列看起来像这样......

12代表空格中需要数字的空格。

private static int[][] currentPuzzle = new int[][] {
        { 12, 12, 6, 12, 12, 12, 12, 12, 12 },
        { 12, 12, 12, 12, 3, 6, 5, 12, 12 },
        { 2, 3, 8, 12, 12, 4, 12, 12, 12 },
        { 8, 7, 12, 12, 12, 12, 12, 12, 5 },
        { 12, 12, 3, 12, 9, 12, 2, 12, 12 },
        { 4, 12, 12, 12, 12, 12, 12, 6, 8 },
        { 12, 12, 12, 4, 12, 12, 8, 1, 9 },
        { 12, 12, 9, 3, 7, 12, 12, 12, 12 },
        { 12, 12, 12, 12, 12, 12, 6, 12, 12 } };

问题是我的程序使用反射java api从游戏中读取数独板的整数。该方法将sudoku板作为一维数组返回,如下所示....

12代表空格中需要数字的空格。

private static int[] currentPuzzle = new int[] { 12, 12, 6, 12, 12, 12, 12,
        12, 12, 12, 12, 12, 12, 3, 6, 5, 12, 12, 2, 3, 8, 12, 12, 4, 12,
        12, 12, 8, 7, 12, 12, 12, 12, 12, 12, 5, 12, 12, 3, 12, 9, 12, 2,
        12, 12, 4, 12, 12, 12, 12, 12, 12, 6, 8, 12, 12, 12, 4, 12, 12, 8,
        1, 9, 12, 12, 9, 3, 7, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 6,
        12, 12 };

我需要将电路板的1D阵列版本(上面显示的第二个阵列)转换为2D阵列版本(上面显示的第一个阵列)格式。新的2D数组必须有9行,每列9列。

你们有什么想法吗?

2 个答案:

答案 0 :(得分:0)

您希望使用嵌套循环来填充2D数组,并在每个点访问1D数组中的正确位置:

int[][] result = new int[9][];
for(int x = 0;x < 9;x++) {
    result[x] = new int[9];
    for(int y = 0;y < 9;y++) {
        result[x][y] = currentPuzzle[9*x+y];
    }
}

您还想考虑什么是X,什么是Y以及1D数组的排序顺序。这段代码可能会产生一个围绕对角线翻转的数独。

答案 1 :(得分:0)

当然 - 看起来这应该很容易。只要您知道它将有81个条目,您可以使用:

public static int[][] convertArray(int[] oldArray) {
    int[][] newArray = new int[9][9];
    for(int i = 0; i < 8; i++) {
        for(int k = 0; k < 8; k++) {
            newArray[i][k] = oldArray[(i * 9) + k]
        }
    }
    return newArray;
}

这个想法是你创建一个新的2D数组,然后外部的forloop控制你将数字放入哪一行,而内部的forloop控制哪一列。