我有一个9x9的2D数组,我希望将其分成9个3x3 2D数组的数组。
这是我到目前为止所做的:
int board[][] = new int[9][9];
// Fill board with numbers...
int[][] nw, n, ne, w, c, e, sw, s, se = new int[3][3];
int[][] sections = { { nw, n, ne }, { w, c, e }, { sw, s, se } };
然后:
nw[][]
将包含board[0][0]
至board[3][3]
。n[][]
由board[4][0]
至board[6][3]
如果不手动将每个元素添加到正确的部分,最好的方法是什么?
答案 0 :(得分:2)
java.util.Arrays.copyOfRange()
可以帮助您解决问题。
答案 1 :(得分:1)
听起来像Sudoko!
上次你将9X9阵列划分为(9)3X3阵列时我解决了这个问题
你可以这样做:
void getSection(int board[9][9],int result[3][3],int x, int y)
{
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++) {
result[i][j] = board[3*x+i][3*y+j];
}
}
}
之后为9X9数组中的每个部分调用getSection:
int s[9][9];
int s1[3][3];
for(i=0;i<3;i++)
{
for(j=0;j<3;j++)
{
getSection(s,s1,i,j);
}
}
或者您可以手动执行此操作:
第0部分:
getSection(s,nw,0,0);
第1部分:
getSection(s,n,0,1);
第2部分:
getSection(s,ne,0,2);
第3部分:
getSection(s,w,1,0);
<强>等强>
请注意您的问题在c ++中的解决方案 但主要思想在java和c ++中是相同的。
答案 2 :(得分:0)
Java不允许对数组进行子索引。
您所指的内容在C中很简单,但在Java中您需要:
在java中,foo[0]
无法将永久引用到另一个数组的元素bar[3]
。
如果您想使用int[][]
,则必须复制数组。 Arrays.copyOfRange
和System.arraycopy
将是最有效的选择,但在数独大小时,它显然没有太大的区别。
对于第二种方法,编写自定义Matrix
类。例如
class Matrix {
int[] flatStorage;
int[] offsets;
Matrix(int[] flatStorage, int[] offsets) {
this.flatStorage = flatStorage;
this.offsets = offsets;
}
void set(int x, int y, int val) {
flatStorage[ offsets[x] + y ] = val;
}
int get(int x, int y) {
return flatStorage[ offsets[x] + y ];
}
}
int[] sharedStorage = new int[27];
Arrays.fill(sharedStorage, -1); // Initialize with -1
int[] allOffsets = new int[]{0,9,18, 27,36,45, 54,63,72};
Matrix nineByNine = new Matrix(sharedStorage, allOffsets);
Matrix northEast = new Matrix(sharedStorage, new int[]{6,15,24});
Matrix southEast = new Matrix(sharedStorage, new int[]{60,69,78});
nineByNine.set(1,7, 2); // Write to middle of upper right quadrant
System.err.println(northEast.get(1, 1)); // Read - should be 2!
自己添加尺寸信息和类似的东西。
答案 3 :(得分:0)
您会考虑以下解决方案“手动”吗?声明
int[][] getSection(int x, int y) {
int[][] result = new int[3][3];
for (int i=0; i<3; i++) {
for (int j=0; j<3; j++) {
result[i][j] = board[3+x+1][3*y+j];
}
}
return result;
}
然后致电
nw = getSection(0,0);
n = getSection(1,0);
等