Алгоритм логического решения для судоку (Java) - PullRequest
0 голосов
/ 26 февраля 2011

Я решил написать алгоритм решения логики для своего приложения Судоку.То, что я написал, работает для ограниченного количества значений сетки, но тогда рекурсия останавливается слишком рано.

Что делают мои методы: addToThirdDimension (): Трехмерный массив хранит любые возможные значения, которые можно поместить взначение сетки в logicGrid [x] [y].Этот метод обновляет трехмерный массив.Это делается путем проверки значений 1-9 в каждом индексе сетки, и, если он действителен, он добавляет это число в массив.Если нет, он устанавливает это значение на ноль.

checkValues ​​(): проверяет, сколько возможностей осталось в трехмерной сетке.Он проходит через logicGrid и возвращает количество ненулевых значений в сетке.

checkSingleValue (int row, int col): Проверяет logicGrid [row] [col], чтобы увидеть, есть ли один и толькотам осталось одно значение (если осталось одно значение, это единственная возможность для элемента сетки в [row, col]).Возвращает количество ненулевых значений, которые находятся в этом расположении сетки.

getSingleValue (int row, int col): Возвращает единственное число, которое осталось в logicGrid [row] [col]

immutableValues: двумерный логический массив, который хранит информацию о том, является ли конкретный элемент сетки неизменным или нет.Если он неизменен, метод решения не должен его трогать.

public boolean solveWithLogic(){

    addToThirdDimension();
    if(checkValues() == 0){
        return true;
    }

    for(int row = 0; row < 9; row++){
        for(int col = 0; col < 9; col++){
            if(!immutableValues[row][col]){
                if(checkSingleValue(row, col) == 1){
                    sGrid[row][col] = getSingleValue(row, col);
                    setValues[row][col] = true;
                    addToThirdDimension();
                }
            }
        }
    }

    if(checkValues() != 0){
        solveWithLogic();
    } else{
        return true;
    }

    return false;
}

Я не могу понять, где я иду не так.После определенного количества попыток checkValues ​​возвращает 0, хотя возможностей должно быть больше.Вот код для addToThirdDimension (), так как я уверен, что если что-то не так, он здесь.

sGrid - это основной двумерный целочисленный массив, в котором хранятся значения для головоломки.

public void addToThirdDimension(){

    logicGrid = new int[9][9][9];

    for(int x = 0; x < 9; x++){
        for(int y = 0; y < 9; y++){
            for(int z = 0; z < 9; z++){
                logicGrid[x][y][z] = z + 1;
            }
        }
    }

    int[][] temp1 = sGrid;

    for(int row = 0; row < 9; row++){
        for(int col = 0; col < 9; col++){
            if(setValues[row][col]){
                for(int i = 0; i < 9; i++){
                    logicGrid[row][col][i] = 0;
                }
            } else{
                for(int i = 1; i <= 9; i++){
                    temp1[row][col] = i;
                    if(!isColumnValid(col, temp1) && !isRowValid(row, temp1) &&
                            !isQuadrantValid(row, col, temp1){
                        logicGrid[row][col][i-1] = 0;
                    }
                }
            }
            temp1[row][col] = sGrid[row][col];
        }
    }
}

Код не слишком эффективен в данный момент.Я хочу, чтобы все заработало, прежде чем я начну минимизировать время решения.

1 Ответ

2 голосов
/ 26 февраля 2011

Первое, что я хотел бы сделать, это создать объект SudukoCell, в котором будут храниться ваши возможные значения.Затем создайте SudukoBoard с двумерным массивом SudukoCells.Также дайте ему массив SudukoAreas.Одна область для строк, одна область для столбцов и одна область для блоков.

Добавьте ваши клетки suduko соответствующим образом.

Это поможет вам закрепить работу ног и предотвратить глупые ошибки.

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

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