题解 | #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;
    }
}

全部评论

相关推荐

犹豫的小狐狸刷了100道题:你是我在牛课上见到的最漂亮的女孩了
点赞 评论 收藏
分享
当初高考报计算机真是造大孽了啊!卷的飞起!哪都是计算机的人,考研,考公,找工作全他奶的计算机的人,太难了。国企也是。关键一届比一届卷,造大孽了!
_Lyrics_:因为计算机,没有体验到快乐的大学研究生时光,好不容易修完课程就要出去实习,看着别人专业可以一起搓麻将,游山玩水,而我却要自己一个人住在北上不到十平米的出租屋,每天两点一线
点赞 评论 收藏
分享
评论
点赞
1
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务