Java 如何在N-Queen问题中跳过重复的电路板状态?

Java 如何在N-Queen问题中跳过重复的电路板状态?,java,algorithm,data-structures,backtracking,n-queens,Java,Algorithm,Data Structures,Backtracking,N Queens,我已经写了一些运行良好的代码,除了它也发现了重复的电路板状态。我希望在代码中进行最小的更改,以便它只能找到唯一的板状态。我正在将代码粘贴到下面: class Solution { List<List<String>> arrangements = new ArrayList<>(); public List<List<String>> solveNQueens(int n) { int

我已经写了一些运行良好的代码,除了它也发现了重复的电路板状态。我希望在代码中进行最小的更改,以便它只能找到唯一的板状态。我正在将代码粘贴到下面:

class Solution {
    
    List<List<String>> arrangements = new ArrayList<>();
    
    public List<List<String>> solveNQueens(int n) {
        int visited[][] = new int[n][n];
        char board[][] = new char[n][n];
        solve(board,visited,0);
        return arrangements;
    }
    
    public boolean solve(char board[][], int visited[][], int queens) {
        if(queens == board.length) {
            return true;
        }
        for(int i = 0; i < board.length; i++) {
            for(int j = 0; j < board.length; j++) {
                if(visited[i][j] == 0) {
                    changePosition(visited,i,j,1); //set
                    board[i][j] = 'Q';
                    if(solve(board,visited,queens+1)) {
                        save(board);
                    }
                    changePosition(visited,i,j,-1); // unset
                    board[i][j] = '.';
                }
            }
        }
        return false;
    }
    
    public void save(char board[][]) {
        List<String> state = new ArrayList<>();
        for(int i = 0; i < board.length; i++) {
            String row = "";
            for(int j = 0; j < board.length; j++) {
                if(board[i][j] == 'Q'){
                    row += 'Q';
                }else{
                    row += '.';
                }
            }
            state.add(row);
        }
        arrangements.add(state);
    }
    
    public void changePosition(int visited[][], int i, int j, int val) {
        // setting the column
        for(int k = 0; k < visited.length; k++) {
            visited[k][j] += val;
        }
        visited[i][j] -= val;
        //setting the row
        for(int k = 0; k < visited.length; k++) {
            visited[i][k] += val;
        }
        visited[i][j] -= val;
        //setting 1 diagonal
        int a = i, b = j;
        while(a < visited.length && b < visited.length) {
            visited[a][b] += val;
            a++;
            b++;
        }
        visited[i][j] -= val;
        a = i;
        b = j;
        while(a >= 0 && b >= 0) {
            visited[a][b] += val;
            a--;
            b--;
        }
        visited[i][j] -= val;
        //setting 2nd diagonal
        a = i;
        b = j;
        while(a < visited.length && b >= 0) {
            visited[a][b] += val;
            a++;
            b--;
        }
        visited[i][j] -= val;
        a = i;
        b = j;
        while(a >=0 && b < visited.length) {
            visited[a][b] += val;
            a--;
            b++;
        }
    }
}
类解决方案{
列表排列=新的ArrayList();
公共列表解算器(int n){
已访问的int[][]=新int[n][n];
字符板[][]=新字符[n][n];
求解(单板,已访问,0);
返回安排;
}
公共布尔解算(字符板[],int访问[],int皇后){
if(皇后区==电路板长度){
返回true;
}
对于(int i=0;i