题解 | #N皇后问题#

N皇后问题

https://www.nowcoder.com/practice/c76408782512486d91eea181107293b6

import java.util.*;


public class Solution {
    /**
     * 
     * @param n int整型 the n
     * @return int整型
     */
    int resNum = 0;
    public int Nqueen (int n) {
        // write code here
        // 用一个标记记录行号,每次从每一行中的每一列中选出一个位置,如果该位置符合条件
        // 则选择放皇后(每行只可能有一个皇后),否则返回上一行,重新选择一列,如果最后选择到了最后一行也选择出了一个皇后,则此时
        // 标记的行号等于矩阵的总行数,代表成功选择出一个方案,然后返回,重新选当前行是否还有适合的,没有就
        // 返回上一行,重新选,没有就选择上一行这样子循环,直到返回到第一行,重新选择下一列(循环),然后判断是否适合放皇后
        // 记录每个皇后的位置,利用一个一维数组,下标是行号,值是列号,代表一个皇后所在的位置
        int[] queenPos = new int[n];
        int row = 0;
        recursion(row, n, queenPos);
        return resNum;
    }
    
    public void recursion(int row, int n, int[] queenPos){
        // 结束条件
        if(row == n){
            resNum++;
            return;
        }
        // 遍历每一行的每一列
        for(int j=0; j<n; j++){
            if(ifRightPos(row,j,queenPos)){
                // 回退的时候会覆盖
                queenPos[row] = j;
                recursion(row+1,n,queenPos);
            }
        }
        return;
        
    }
    // 用于判断某个位置是否是合理的位置可以放置皇后
    public boolean ifRightPos(int row, int line, int[] queenPos){
        // 遍历整个queenPos的每个皇后,判断当前传递过来的下标是否和这些皇后同行同列同斜线
        for(int i=0; i<row; i++){
            // 同行         同列                      同斜线
            if(row == i || line == queenPos[i] || Math.abs(row-i) == Math.abs(line-queenPos[i])){
                return false;
            }
        }
        return true;
    }
}

全部评论

相关推荐

Natrium_:这时间我以为飞机票
点赞 评论 收藏
分享
牛客101244697号:这个衣服和发型不去投偶像练习生?
点赞 评论 收藏
分享
点赞 1 评论
分享
牛客网
牛客企业服务