Проблема с методом добавления вектора 2D-массива в Java - PullRequest
0 голосов
/ 21 апреля 2019

Я объявил вектор 2D-массива в Java.На каждом шаге я добавляю массив в вектор методом add ().Но когда распечатаешь этот вектор, чтобы увидеть, что внутри, я получаю неожиданный вывод.Ни один из этих массивов данных не был добавлен.Мой код:

    static Vector<int[][]> latinSquare;
    static int[][] square;
    static int[][] maskRow, maskCol;

    static int[] extractCoor(int x, int n) {
        int[] ans = new int[2];
        ans[0] = x / n;
        ans[1] = x % n;
        return ans;
    }

    static void backtrack(int pos, int n) {
        int[] coor = extractCoor(pos, n);
        int x = coor[0], y = coor[1];

        for (int candidate = 0; candidate < n; candidate++) {
            if (maskRow[x][candidate] == 0 && maskCol[y][candidate] == 0) {
                square[x][y] = candidate;

                if (pos == n * n - 1) {
                    latinSquare.add(square);
                    printArr(square, n, n);
                } else {
                    maskRow[x][candidate] = 1;
                    maskCol[y][candidate] = 1;
                    backtrack(pos + 1, n);
                    maskRow[x][candidate] = 0;
                    maskCol[y][candidate] = 0;
                }
            }
        }
    }

Когда я распечатываю square, я получаю правильный список латинских квадратов размером n = 3.

0 1 2 
1 2 0 
2 0 1 

0 1 2 
2 0 1 
1 2 0 

0 2 1 
1 0 2 
2 1 0 

0 2 1 
2 1 0 
1 0 2 

1 0 2 
0 2 1 
2 1 0 

1 0 2 
2 1 0 
0 2 1 

1 2 0 
0 1 2 
2 0 1 

1 2 0 
2 0 1 
0 1 2 

2 0 1 
0 1 2 
1 2 0 

2 0 1 
1 2 0 
0 1 2 

2 1 0 
0 2 1 
1 0 2 

2 1 0 
1 0 2 
0 2 1 

Но когда я распечатываювектор latinSquare, у меня неправильный вывод:

    static void latinSquareBuilder(int n) {
        latinSquare = new Vector<int[][]>();
        maskRow = new int[n][n];
        maskCol = new int[n][n];
        square = new int[n][n];

        backtrack(0, n);

        for (int i = 0; i < latinSquare.size(); i++)
            printArr(latinSquare.get(i), n, n);
    }

    static void printArr(int[][] arr, int n, int m) {
        for (int i = 0; i < n; i++) {
            for (int j = 0; j < m; j++) {
                System.err.print(arr[i][j] + " ");
            }
            System.err.println();
        }
        System.err.println();
    }

Выход:

2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 

2 1 0 
1 2 2 
0 2 1 

1 Ответ

1 голос
/ 21 апреля 2019

Это потому, что квадрат - это матрица, а latinSquare - это вектор.Взгляните здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...