小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。
题目
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
};
最后
曾梦想仗剑走天涯
看一看世界的繁华
年少的心总有些轻狂
终究不过是个普通人
无怨无悔我走我路