/ / Podziel tablicę 2D na tablicę wielu mniejszych tablic? - java, tablice, macierz, podział

Podziel tablicę 2D na tablicę wielu mniejszych tablic? - Java, tablice, macierz, split

Mam tablicę 2D 9x9, którą chcę podzielić na tablicę 9 tablic 2D 3x3.

Oto, co mam do tej pory:

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 } };

Potem:

  • nw[][] składałby się z board[0][0] przez board[3][3].
  • n[][] składa się z board[4][0] przez board[6][3]
  • itp.

Jak najlepiej to zrobić bez ręcznego dodawania każdego elementu do właściwej sekcji?

Odpowiedzi:

2 dla odpowiedzi № 1

java.util.Arrays.copyOfRange() może ci pomóc.


1 dla odpowiedzi nr 2

brzmi jak Sudoko!

Rozwiązałem ten problem ostatnim razem, gdy możesz podzielić tablicę 9X9 na (9) tablice 3X3

możesz to zrobić w ten sposób:

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];
}
}
}

po tym wywołaniu getSection dla każdej sekcji w tablicy 9X9:

 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);
}
}

lub możesz to zrobić ręcznie:

sekcja 0:

  getSection(s,nw,0,0);

Sekcja 1 :

 getSection(s,n,0,1);

sekcja 2:

 getSection(s,ne,0,2);

Sekcja 3 :

 getSection(s,w,1,0);

itp.

zauważ, że rozwiązanie twojego pytania w c ++ ale główna idea jest taka sama w java i c ++.


0 dla odpowiedzi № 3

Java nie pozwala na subindeksowanie tablic.

To, o czym mówisz, jest trywialnie możliwe w C, ale w Javie musisz:

  • skopiuj dane do nowych tablic
  • użyj niestandardowej klasy abstrakcji z pamięci.

W java nie ma takiej możliwości foo[0] na stałe odnosi się do elementu bar[3] innej tablicy.

Jeśli chcesz pracować int[][], będziesz musiał skopiować tablice. Arrays.copyOfRange i System.arraycopy będą najskuteczniejszymi opcjami, ale przy rozmiarze Sudoku oczywiście nie robi to żadnej różnicy.

W przypadku drugiego podejścia napisz niestandardowy Matrix klasa. Na przykład

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!

Dodaj informacje o rozmiarze i podobne rzeczy samodzielnie.


0 dla odpowiedzi nr 4

Czy uważasz, że następujące rozwiązanie jest „ręczne”? Ogłosić

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;
}

Wtedy zadzwoń

nw = getSection(0,0);
n = getSection(1,0);

itp.