• [leedcode 51] N-Queens


    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.

    For example,
    There exist two distinct solutions to the 4-queens puzzle:

    [
     [".Q..",  // Solution 1
      "...Q",
      "Q...",
      "..Q."],
    
     ["..Q.",  // Solution 2
      "Q...",
      "...Q",
      ".Q.."]
    ]
    public class Solution {
        List<List<String>> res;
        int A[];
        public List<List<String>> solveNQueens(int n) {
            //经典的DFS,
            //解题思想:借助一个数组储存当前的状态A[i]=j表示第i行,第j列有一个皇后"Q"
            //函数nqueens(int cur,int n),代表cur行之前的已经满足规则,需要从cur到n进行深搜
            //递归过程中,需要验证第cur行是否满足要求,满足要求的规则通过isvalid给出,必须保证前cur行的A[i]!=A[cur],并且不在一个对角线上
            //即,Math.abs(A[i]-A[cur])!=cur-i
            //递归的终止条件是cur==n,此时需要保存中间结果
            //Start: placeQueen(0,n)
            //if current ==n then print result
            //else
            //    for each place less than n,
            //place queen
            //if current state is valid, then place next queen place Queen(cur+1,n)
            //   end for
            //end else
            res=new ArrayList<List<String>>();
            A=new int[n];
            nqueens(0,n);
            return res;
        }
        public void nqueens(int cur,int n){
            if(cur==n) printQ(n);
            else{
                for(int i=0;i<n;i++){
                    A[cur]=i;//注意,不需要删除,下次重新赋值
                    if(isValid(cur))
                        nqueens(cur+1,n);
                }
            }
        }
        public  void printQ(int n){
            List<String>  ress=new ArrayList<String>();
            for(int i=0;i<n;i++){
                
                StringBuilder seq=new StringBuilder();
                for(int j=0;j<n;j++){
                    if(A[i]==j)seq.append("Q");
                    else seq.append(".");
                }
                ress.add(seq.toString());
            }
            res.add(ress);
        }
        public boolean isValid(int cur){
            for(int i=0;i<cur;i++){//注意i的范围!
                if(A[i]==A[cur]||Math.abs(A[i]-A[cur])==cur-i)
                        return false;
            }
            return true;
            
            
        }
    }
  • 相关阅读:
    StringBuffer与Stringbuilder
    String与其他类型的转换
    创建多进程的方法
    8.进程
    克隆虚拟机
    初探12306售票算法(二)-java代码实践
    初探12306售票算法(一)- 理论
    手机上mcd程序耗电异常问题相关
    vue版app上下拉加载
    css基础
  • 原文地址:https://www.cnblogs.com/qiaomu/p/4641011.html
Copyright © 2020-2023  润新知