N皇后问题 - 解法三

import java.util.*;
public class Solution {
    private int res;

    public int Nqueen (int n) {
        res = 0;
        //下标为行号,元素为列号,记录皇后位置
        int[] pos = new int[n];
        Arrays.fill(pos, 0);
        //递归
        recursion(n, 0, pos);
        return res;
    }


    //递归查找皇后种类
    public void recursion(int n, int row, int[] pos) {
        //完成全部行都选择了位置
        if (row == n) {
            res++;
            return;
            //return后次轮递归结束,自动返回上层迭代,row-1
        }
        //遍历所有列
        for (int i = 0; i < n; i++) {
            //检查该位置是否符合条件
            if (isValid(pos, row, i)) {
                //加入位置
                pos[row] = i;
                //递归继续查找
                recursion(n, row + 1, pos);
                //因为siValid每次判断的时候只判断row之前的行,
                //每次迭代之后,row自动减一,所以这里不用回溯pos
            }
        }

        //结束条件是,当经过几轮递归和回溯,row0 从 0分支 切换到 n分支 , row1和row2遍历之后回溯,row0轮迭代的i=n循环结束,row0轮(第一轮迭代)退出,程序结束
    }

    //判断皇后是否符合条件
    public boolean isValid(int[] pos, int row, int col) {
        //遍历所有已经记录的行
        for (int i = 0; i < row; i++) {
            //不能同行同列同一斜线
            if (row == i || col == pos[i] || Math.abs(row - i) == Math.abs(col - pos[i]))
                return false;
        }
        return true;
    }


}

   20ms

posted @ 2022-10-26 21:28  yanher  阅读(27)  评论(0)    收藏  举报