首页 > 其他 > 详细

[Leetcode]-- N-Queens II

时间:2014-02-07 10:39:29      阅读:352      评论:0      收藏:0      [点我收藏+]

Follow up for N-Queens problem.

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

bubuko.com,布布扣

跟N-Queens 一个解发 最后return result.size()

bubuko.com,布布扣
public class Solution{

    public ArrayList<String[]> solveNQueens(int n) {  
        ArrayList<String[]> result = new ArrayList<String[]>();  
        int[] queenList = new int[n];  
        placeQueen(queenList, 0, n, result);  
        return result;  
    }  
       
    // 递归回溯8皇后,关键记录下到达了哪一行了  
    public void placeQueen(int[] queenList, int row, int n, ArrayList<String[]> result){  
        // Base Case, 已经完成任务了  
        if(row == n){  
            StringBuilder[] sol = new StringBuilder[n];  
               
            // 对数组内每一个对象都要new出其对象, 并将其全设为‘.‘ 
            for(int i=0; i<n; i++){  
                sol[i] = new StringBuilder();  
                for(int j=0; j<n; j++){  
                    sol[i].append(".");  
                }  
            }  
            // 在相应的地方放置queen  
            for(int i=0; i<n; i++){  
                sol[i].setCharAt(queenList[i], ‘Q‘);  
            }  
            String[] ss = new String[n];  
            for (int i=0; i<n; i++) {  
                ss[i] = sol[i].toString();  
            }  
            result.add(ss);  
            return;  
        }  
           
        // 开始这一行的查找  
        // 遍历第row行的所有列,测试哪一个位置是安全的,然后一行一行的放queen 
        for(int col=0; col<n; col++){  
            if(isSafe(queenList, row, col)){  
                queenList[row] = col;  
               //递归到下一行
                placeQueen(queenList, row+1, n, result);  
            }  
        }  
    }  
       
    // 判断是否坐标(row,col)的位置是安全的(检查行,列,正反对角线)  
    // queenList里面存放行,列坐标pair,即queenList[row] = col  
    public boolean isSafe(int[] queenList, int row, int col){
      //遍历当前row之前的所有row
        for(int preRow=0; preRow<row; preRow++){  
            // 得到上一行queen 放在哪一个 col里
            int preCol = queenList[preRow];  
            if(preRow == row){      // 理论上不必检查,因为preRow是总是小于row的  
                return false;  
            }  
            if(preCol == col){          // 检查是否在同一列  
                return false;  
            }  
            if(row-preRow == col-preCol){       // 反对角线  
                return false;  
            }  
            if(preRow+preCol == row+col){       // 正对角线  
                return false;  
            }  
        }  
        return true;  
    }      

}
bubuko.com,布布扣

[Leetcode]-- N-Queens II

原文:http://www.cnblogs.com/RazerLu/p/3539163.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!