Проверить, существует ли число в строке и столбце в двумерном массиве Java - PullRequest
3 голосов
/ 10 июля 2020

Пытаюсь сделать программу, генерирующую рамдом судоку. Программа проверяет, не повторяется ли число в строке и в столбце,

verifyExistNumberInRow -> работает идеально

Но при вызове verifyExistNumberInColumn -> бесконечное l oop

Почему я не нашел решения, это проблема индекса? или проблема стоимости?.

Спасибо.

/**
 * Generate a random Sudoku
 */

private static void generateRandomSudoku() {

    Integer[][] array = new Integer[9][9];
    Integer number;

    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array[i].length; j++) {

            do {
                number = (int) (Math.random() * 9) + 1;

            } while (verifyExistNumberInRow(number, array[i]) || verifyExistNumberInColumn(j, number, array));

            array[i][j] = number;
        }
    }

    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array[i].length; j++) {
            System.out.print(array[i][j] + " ");
        }
        System.out.print("\n");
    }
}

/**
 * Check if a number exist in array file.
 *
 * @param number
 * @param array
 * @return True if exist, other false.
 */
private static boolean verifyExistNumberInRow(Integer number, Integer[] array) {

    return Stream.of(array)
            .filter(Objects::nonNull)
            .anyMatch(element -> element.equals(number));
}

/**
 * Check if a number exist in array column
 *
 * @param position column number
 * @param number   number to find in column
 * @param array
 * @return true if exist, other false
 */
private static boolean verifyExistNumberInColumn(Integer position, Integer number, Integer[][] array) {

    for (int i = 0; i < array.length; i++) {
        if (array[i][position] != null) {

            if (array[i][position].equals(number)) {
                return true;
            }
        }
    }
    return false;
}

Ответы [ 2 ]

0 голосов
/ 13 июля 2020

Решение, которое я нахожу, удаляет строку, когда число находится в столбце. И работает это.

 private static void generateRandomSudoku() {

    Integer[][] array = new Integer[9][9];
    Integer number;

    for (int i = 0; i < array.length; i++) {
        for (int j = 0; j < array[i].length; j++) {

            boolean found = true;

            while (found) {

                number = (int) (Math.random() * 9) + 1;

                if (!verifyExistNumberInRow(number, array[i])) {
                    if (!verifyExistNumberInColumn(j, number, array)) {
                        array[i][j] = number;
                        found = false;
                    } else {
                        array = deleteRow(i, array);
                        j = 0;
                    }
                }
            }
        }

    }

    printSudoku(array);
}

/**
 * Delete (set to null) values for a row from bidimensional array
 * 
 * @param row row number to delete
 * @param array
 * @return 
 */
private static Integer[][] deleteRow(int row, Integer[][] array) {

    for (int i = 0; i < array.length; i++) {
        array[row][i] = null;
    }
    return array;
}


/**
 * Check if a number exist in array file.
 *
 * @param number
 * @param array
 * @return True if exist, other false.
 */
private static boolean verifyExistNumberInRow(Integer number, Integer[] array) {

    return Stream.of(array)
            .filter(Objects::nonNull)
            .anyMatch(element -> element.equals(number));
}

/**
 * Check if a number exist in array column
 *
 * @param position column number
 * @param number   number to find in column
 * @param array
 * @return true if exist, other false
 */
private static boolean verifyExistNumberInColumn(Integer position, Integer number, Integer[][] array) {

    for (int i = 0; i < array[position].length; i++) {
        if (array[i][position] != null) {

            if (array[i][position].equals(number)) {
                return true;
            }
        }
    }
    return false;
}
0 голосов
/ 10 июля 2020

Попробуйте поменять местами 'position' и 'i' и добавить «i

private static boolean verifyExistNumberInColumn(Integer position, Integer number, Integer[][] array) {

for (int i = 0; i < array[position].length; i++) {
    if (array[position][i] != null) {

        if (array[position][i].equals(number)) {
            return true;
        }
    }
}
return false;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...