51. N-Queens (JAVA)

The n-queens puzzle is the problem of placing n queens on an n×n chessboard such that no two queens attack each other.

Given an integer n, return all distinct solutions to the n-queens puzzle.

Each solution contains a distinct board configuration of the n-queens' placement, where 'Q'and '.' both indicate a queen and an empty space respectively.

Example:

Input: 4
Output: [
 [".Q..",  // Solution 1
  "...Q",
  "Q...",
  "..Q."],

 ["..Q.",  // Solution 2
  "Q...",
  "...Q",
  ".Q.."]
]
Explanation: There exist two distinct solutions to the 4-queens puzzle as shown above.
 

注意:任意斜线也不能有两个Q

class Solution {
    public List<List<String>> solveNQueens(int n) {
        List<String> ans = new ArrayList<String>();
        //initialize ans
        for(int i = 0; i < n; i++){
            StringBuilder s = new StringBuilder();
            for(int j = 0; j < n; j++){
                s.append(".");
            }
            ans.add(s.toString());
        }

        dfs(n,0,ans);
        return ret;
    }
    
    public void dfs(int n, int depth, List<String> ans){
        
        if(depth == n) {
            List<String> new_ans = new ArrayList<String>(ans);
            ret.add(new_ans);
            return;
        }
        StringBuilder strBuilder = new StringBuilder(ans.get(depth));
        for(int i = 0; i < n; i++){
            if(check(n, ans, depth, i)) continue; //already have Q in this column
            
            strBuilder.setCharAt(i, 'Q');
            ans.set(depth, strBuilder.toString());
            dfs(n, depth+1, ans);
            strBuilder.setCharAt(i, '.'); //recover
            ans.set(depth, strBuilder.toString());
        }
    }
    
    public Boolean check(int n, List<String> ans, int i, int j){
        for(int k = 0; k < i; k++){ //iterate n line
            //i-k = j-x => x = j+k-i; i-k = x-j => x = i+j-k
            if( ans.get(k).charAt(j) == 'Q'
               ||(j+k-i >= 0 && ans.get(k).charAt(j+k-i) == 'Q') 
               || (i+j-k < n && ans.get(k).charAt(i+j-k) == 'Q')) 
                return true;
        }
        
        return false;
    }
    
    private List<List<String>> ret = new ArrayList<>();
}

 

posted on 2019-06-28 21:04  joannae  阅读(245)  评论(0编辑  收藏  举报

导航