zoukankan      html  css  js  c++  java
  • [LeetCode] 52. N-Queens II Java

    题目:

     Follow up for N-Queens problem.

     Now, instead outputting board configurations, return the total number of distinct solutions.

     

    题意及分析:这道题的解法和上一题的解法一模一样。只是输出值不一样,这里要输出一个整数,但是递归里面直接传局部变量不会保存值。所以我们这里可以直接使用上一题的的list.size()得到答案,也可以使用一个长度为1的数组保存值,或者使用一个全局变量保存值。我这里使用的是一个长度为1的数组保存结果值。

    代码: 

    class Solution {
        public int totalNQueens(int n) {
            int[] res = new int[1];
            char[][] matrix = new char[n][n];
            for(int i=0;i<n;i++){
                for(int j=0;j<n;j++)
                    matrix[i][j] = '.';
            }
            backtracking(res,matrix,0,n);
            return res[0];
        }
    
        private void backtracking(int[] res,char[][] matrix,int i,int n){
            if(i==n-1){
                for(int j=0;j<n;j++){
                    if(isValid(matrix,i,j,n)){        //合法的皇后
                        res[0]++;
                    }
                }
                return;
            }
            for(int j=0;j<n;j++){
                if(isValid(matrix,i,j,n)){
                    matrix[i][j] = 'Q';
                    backtracking(res,matrix,i+1,n);
                    matrix[i][j] = '.';
                }
            }
        }
    
        private boolean isValid(char[][] matrix,int i,int j,int n){
            boolean res = true;
            //只对i上面的行检查,判断是否在一列或者在一条斜线上
            int up = i-1;
            while(up>=0){
                if(matrix[up][j]=='Q') return false;
                up--;
            }
            //左上
            int left = j-1,upleft = i-1;
            while(left>=0 && upleft>=0){
                if(matrix[upleft--][left--]=='Q') return false;
            }
            //右上
            int right = j+1,upRight = i-1;
            while(right<n && upRight>=0){
                if(matrix[upRight--][right++]=='Q') return false;
            }
            return res;
        }
    }
    

      

  • 相关阅读:
    1295: [SCOI2009]最长距离
    [vijos p1028] 魔族密码
    HJ浇花
    1060: [ZJOI2007]时态同步
    1816: [Cqoi2010]扑克牌
    1800: [Ahoi2009]fly 飞行棋
    4300: 绝世好题
    1237: [SCOI2008]配对
    1801: [Ahoi2009]chess 中国象棋
    1189: [HNOI2007]紧急疏散evacuate
  • 原文地址:https://www.cnblogs.com/271934Liao/p/6955671.html
Copyright © 2011-2022 走看看