Почему эта программа находит только одно решение?

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

public static boolean isSafe(int[][] board, int row, int col) {

    for(int i = 0; i < board.length; i++) {
        if(row != i) {
            if(board[i][col] == board[row][col]) return false;
        }
        if(col != i) {
            if(board[row][i] == board[row][col]) return false;
        }
    }
    return true;
}

public static void enumerate(int N) {
    int[][] board = new int[N][N];
    enumerate(board, 0, 0);
}

public static void enumerate(int[][] board, int row, int col) {
    int boardSize = board.length;
    if (col == boardSize ) {
        System.out.println();
        print(board);
        SaveToFile.saveSquare("Latin", "BT", board, boardSize);

    }
    else {
        for (int i = 1; i <= boardSize; i++) {
            board[row][col] = i; 
            if (isSafe(board, row, col)) {
                if(row+1 == boardSize) {
                    enumerate(board, 0, col+1);
                }
                else {
                    enumerate(board, row+1, col);
                }
            }
        }
    }
}

public static void print(int[][] board) {
    for(int i=0; i<board.length;i++) {
        for(int j=0; j<board.length; j++) {
            System.out.print(" "+board[i][j]+" ");
        }
        System.out.println();
    }
    System.out.println();
}

public static void main(String[] args) {

    for(int i = 2; i <=2; i++) {
        SaveToFile.createFile("Latin", "BT", i);
        enumerate(i);
    }
}

Я знаю, что мой код выглядит плохо, но я реорганизую его позже;) спасибо за помощь:)

1 ответ

Вы должны очистить значение, которое вы устанавливаете на доске после рекурсивных вызовов:

public static void enumerate(int[][] board, int row, int col) {
    int boardSize = board.length;
    if (col == boardSize ) {
        System.out.println();
        print(board);
        SaveToFile.saveSquare("Latin", "BT", board, boardSize);

    }
    else {
        for (int i = 1; i <= boardSize; i++) {
            board[row][col] = i;
            if (isSafe(board, row, col)) {
                if(row+1 == boardSize) {
                    enumerate(board, 0, col+1);
                }
                else {
                    enumerate(board, row+1, col);
                }
            }
            //RESET!!!
            board[row][col] = 0;
        }
    }
}
Другие вопросы по тегам