「前端刷题」52. N皇后 II

82 阅读1分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

题目

n 皇后问题 研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。

给你一个整数 n ,返回 n 皇后问题 不同的解决方案的数量。

 

示例 1:

输入: n = 4 输出: 2 解释: 如上图所示,4 皇后问题存在两个不同的解法。

示例 2:

输入: n = 1 输出: 1

 

提示:

  • 1 <= n <= 9
  • 皇后彼此不能相互攻击,也就是说:任何两个皇后都不能处于同一条横行、纵行或斜线上。

思路

皇后问题 判断当前列 和左斜线和右斜线是否有重复

var totalNQueens = function(n) {
    // 花了两小时 重新做了N皇后问题
    let dp=Array.from(Array(n),()=>Array(n).fill(0))
    let sum=0;
    const dfs=(x)=>{
        if(x>=n){
             sum++;
            return false
        }
        for(let i=0;i<n;i++){
            if(isValid(x,i)){
                dp[x][i]=1;
                dfs(x+1);
                dp[x][i]=0;
            }
        }
    }
    const isValid=(x,y)=>{
        //因为每行只加一次 所以不用判断当前行 只需判断当前列 和左斜线和右斜线是否有重复
        for(let i=0;i<n;i++){ // 当前列是否有重复
            if(dp[i][y]!=0){
                return false
            }
        }

        let temp=Math.abs(x-y)
        let i=x,j=y
        while(i>0&&j>0){ // 找到左斜线的起点
           i--;
           j--;
        }
        for(let k=0;k<n-temp;k++){ //判断左斜线是否有皇后
          if(dp[i+k][j+k]!=0){
              return false
          }
        }
        i=x,j=y;
        while(i<n-1&&j>0){ // 找到右斜线的起点
            i++;
            j--;
        }
        for(let k=0;k<i-j+1;k++){ // 判断右斜线是否有皇后
          if(dp[i-k][j+k]!=0){
              return false
          }
        }
        return true;
    }
    dfs(0)
    return sum
};

最后

曾梦想仗剑走天涯

看一看世界的繁华

年少的心总有些轻狂

终究不过是个普通人

无怨无悔我走我路