n皇后问题
n 皇后问题研究的是如何将 n 个皇后放置在 n×n 的棋盘上,并且使皇后彼此之间不能相互攻击。
对角线,行,列
给定一个整数 n,返回 n 皇后不同的解决方案的数量。
示例:
输入: 4
输出: 2
解释: 4 皇后问题存在如下两个不同的解法。
[
[".Q..", // 解法 1
"...Q",
"Q...",
"..Q."],
["..Q.", // 解法 2
"Q...",
"...Q",
".Q.."]
]
var demo = function(num){ let type = 0; let col = []; //初始化 let temp = new Array(); for(let i=0;i<=num+1;i++){ temp[i] = new Array(); for(let j=0;j<=num+1;j++){ temp[i][j] = 0; } col[i] = 0;//列 } var check = function(temp,sum,i){ if(sum === num){ type ++; let t = ''; for(let i=1;i<=num;i++){ for(let j=1;j<=num;j++){ t = t+temp[i][j]+" "; } t = t + '\n'; } console.log(t) console.log("=======================================") return; } if(i>num){ return; } for(let j=1;j<=num;j++){ if(col[j]===0&&temp[i-1][j-1]===0&&temp[i-1][j+1]===0){//去除列上相同的,以及最近对角线上的数据 let flag = 0; for(let k =1;k<=num;k++){ for(let d= 1;d<=num;d++){ if(temp[k][d]==1&&(Math.abs(k-i)==Math.abs(d-j))){//检测是否斜对角线上存在。 flag= 1; break; } } } if(flag === 0){ temp[i][j] = 1; sum = sum + temp[i][j]; col[j] = 1; check(temp,sum,i+1); sum = sum - temp[i][j]; temp[i][j] = 0; col[j] = 0; } } } } check(temp,0,1) return type; }
经过多次的回溯联系基本上回溯算法的大概就是
var demo = function(num){ let type = 0;//初始化一些全局要使用的数组或数据 var check = function(temp,sum,i){ if(sum === num){//符合条件返回 //1.将符合条件的数组或是数据存放到相对应的列表 //2.将符合条件的个数加一 return; } //不符合条件的进行返回 if(i>num){ return; } for(let j=1;j<=num;j++){ //将不符合或则使重复的数据过滤掉,剪枝 if(col[j]===0&&temp[i-1][j-1]===0&&temp[i-1][j+1]===0){ //1.提取所有元素都要做的操作 push()//将符合条件的元素添加到列表或则是将符合条件的元素 check(temp,sum,i+1);//2.将向下进行分支元素的操作 pop()//进行回溯,将分支向上回溯 } } } check(temp,0,1) return type; }
来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/n-queens-ii
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。