我最近开始制作一个数独求解器。求解器本身已经完成并且工作得很好,但我发现了一个问题。我的解算器基于存储数独游戏棋盘编号的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列。
你们有什么想法吗?
答案 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控制哪一列。