首页 > 代码库 > N皇后问题

N皇后问题

n皇后问题是将n个皇后放置在n*n的棋盘上,皇后彼此之间不能相互攻击。

给定一个整数n,返回所有不同的n皇后问题的解决方案。

每个解决方案包含一个明确的n皇后放置布局,其中“Q”和“.”分别表示一个女王和一个空位置。

 
样例

对于4皇后问题存在两种解决的方案:

[

    [".Q..", // Solution 1

     "...Q",

     "Q...",

     "..Q."],

    ["..Q.", // Solution 2

     "Q...",

     "...Q",

     ".Q.."]

]

 

思路:由题意可知,每一行只能有一个,每一列也只能有一个,同一斜线上也只能有一个,  那么可以用一个数组来表示位置ARR[2]=1表示第三行的皇后在第二列(索引从0开始),这样每一行只会有一个了。main函数的主要作用是检查第i行可以放哪些位置,然后然后把对应的..Q序列放进temp中,然后递归调用main,最后要再把上一步放入的序列拿出来。。。本来一看好麻烦,可是动手开始敲了,当做一个个小问题来处理,没想到竟然一遍bug free了,还是要多尝试

java版代码

class Solution {
    /**
     * Get all distinct N-Queen solutions
     * @param n: The number of queens
     * @return: All distinct solutions
     * For example, A string ‘...Q‘ shows a queen on forth position
     */
    ArrayList<ArrayList<String>> solveNQueens(int n) {
        // write your code here
        int[] arr=new int[n];
        ArrayList<ArrayList<String>> ans=new ArrayList<ArrayList<String>>();
        ArrayList<String> temp=new ArrayList<String>();
        main(temp,ans,n,0,arr);
        return ans;
        
    }
    void main(ArrayList<String> temp,ArrayList<ArrayList<String>> ans,int n,int i,int[] arr){
        if(temp.size()==n){
            ans.add(new ArrayList(temp));
            return;
        }
        for(int k=0;k<n;k++){
            if(isthat(arr,i,k)){
                arr[i]=k;
                String s=pr(k,n);
                temp.add(s);
                main(temp,ans,n,i+1,arr);
                temp.remove(temp.size()-1);
            }
        }
        return;
    }
    boolean isthat(int[] arr,int k,int n){
        for(int i=0;i<k;i++){
            if(arr[i]==n||Math.abs(i-k)==Math.abs(n-arr[i])){
                return false;
            }
        }
        return true;
    }
    String pr(int n,int an){
        String s="";
        for(int i=0;i<n;i++){
            s+=".";
        }
        s+="Q";
        for(int i=n+1;i<an;i++){
            s+=".";
        }
        return s;
    }
};

 

N皇后问题