LeetCode 52. N-Queens II

本题是要求n皇后的解法:看起来甚至比N-Queens(求全部的解)还简单,很容易写出下面的代码:

import java.util.*;


public class Solution {
    /**
     * 
     * @param n int整型 the n
     * @return int整型
     */
    //private List<List<String>> rs;
    private int cnt;
    // 从上往下 一行行排
    private void helper(int[] board,int row){
        if(row==board.length){
            cnt++;
        }
        for(int i=0;i<board.length;i++){
            if(valid(board,row,i)){
                board[row]=i;
                helper(board,row+1);
            }
        }
    }
    private boolean valid(int[] board,int row,int col){
        // 因为是从上到下,所以当然不同行
        // 首先检查不同列
        for(int i=0;i<row;i++){
            if(board[i]==col){
                return false;
            }
        }
        // 检查对角:
        for(int i=0;i<row;i++){
            int leftUp=col-(row-i);
            int rightUp=col+(row-i);
            if(board[i]==leftUp||rightUp==board[i]){
                return false;
            }
        }
        return true;
    }
    public int Nqueen (int n) {
       // rs=new ArrayList<>();
        helper(new int[n],0);
        return cnt;
    }
}

上述代码在lc能通过,但是在牛客上不能通过全部的测试用例,只能过87%

搜了一下,发现因为这里不需要求出全部的解,那么可以做一些优化:

class Solution {
    private int cnt;
    // 分别用来表示当前行,当前主副对角线是否有queen
    private boolean[] cols;
    private boolean[] dg1;
    private boolean[] dg2;
    private void heleper(int r){
        if(r==cols.length){
            cnt++;
            return;
        }
        for(int i=0;i<cols.length;i++){
            // 遍历所有的列,并判断(r,i)对应点的同列,同主副对角线是否有摆放queen
            // 这里利用到一个性质:所有主对角线上的点的r+c相等(类似x+y=c),所有副对角线上的点的r-c相等(类似y=x+c)
            int idg1=r+i;// r+i的取值范围是[0,2n-2]
            int idg2=r-i+cols.length;// r-i的取值范围是[1-n,n-1],加一个n就是[1,2*n-1]
            if(cols[i]||dg1[idg1]||dg2[idg2]){
                continue;
            }
            cols[i]=dg1[idg1]=dg2[idg2]=true;
            heleper(r+1);
            // 这里似乎用一个计数来判断才对:因为一个对角线上可能放多个Q
            // 但是问题在于,只要放了一个,上面就会continue,所以用boolean即可
            cols[i]=dg1[idg1]=dg2[idg2]=false;
        }
    }
    public int totalNQueens(int n) {
        cols=new boolean[n];
        dg1=new boolean[2*n];
        dg2=new boolean[2*n];
        heleper(0);
        return cnt;
    }
}

(刷题因为中间荒废了一段时间 现在还是需要循序渐进 这个思路理解了半天 当然也可能是我状态问题

加油

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值