1

我有一个 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]thru组成board[3][3]
  • n[][]包括board[4][0]通过board[6][3]
  • 等等

在不手动将每个元素添加到正确部分的情况下,最好的方法是什么?

4

4 回答 4

2

java.util.Arrays.copyOfRange()可以让你参与其中。

于 2013-05-30T18:14:15.397 回答
1

听起来像须藤子!

上次我解决了这个问题,你可以将 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++ 中是相同的。

于 2015-07-29T12:33:55.800 回答
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!

自己添加尺寸信息和类似的东西。

于 2013-05-30T20:06:24.757 回答
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);

等等

于 2013-05-30T21:03:09.487 回答