N皇后问题

牛客地址

解题思路

利用boolean[] visited数组加以辅助, 表示第i个位置是否可以放置。

nums[i] 表示第i个皇后放置的列号。

dfs(int[] nums, int cur, int n):将第cur个皇后进行放置

在每次放置前,先遍历之前已经完成放置的cur - 1个皇后。for i = 0 to cur - 1

        int v = nums[i];//得到皇后的位置,将visited[v]设置为false, 表示第cur个皇后不能放置在v列。

        将和(i, nums[i]) 在同一对角线上的(cur, ?)中的visited[?]设置为false, 如何求?呢? distanceX = cur - i; ? = v + distanceX 或者 ? = v - distanceX

遍历当前行所有可放皇后的位置,进行递归。

实现代码


import java.util.*;


public class Solution {
    /**
     *
     * @param n int整型 the n
     * @return int整型
     */
    private  int count = 0;
    public  int Nqueen (int n) {
        // write code here
        int[] nums = new int[n];
        backtracking(0, nums);
        return count;
    }
    //放置第k个皇后
    public void backtracking(int cur, int[] nums){
        int n = nums.length;
        if(cur == n){
            count ++;
            return;
        }
        boolean [] visited = new boolean[n];
        for(int i = 0; i < cur; i++){
            int v = nums[i];
            visited[v] = true;
            int distance = cur - i;
            int l = v - distance;
            int r = v + distance;
            if(l >= 0){
                visited[l] = true;
            }
            if(r < n){
                visited[r] = true;
            }
        }
        for(int i = 0; i < n; i++){
            if(!visited[i]){
                nums[cur] = i;
                backtracking(cur + 1, nums);
            }
        }
    }
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值