思路分析:
- 第一个皇后先放第一行第一列
- 第二个皇后放在第二行第一列,然后判断是否冲突,如果冲突,继续放在第二列、第三列……依次把所有列都放完,直到找到一个合适的
- 继续第三个皇后,还是第一列、第二列……直到第八个皇后也能放在一个不冲突的位置,算是找到一个正确解
- 当得到一个正确解时,在栈回退到上一个栈时,就会开始回溯,即将第一个皇后放在第一列,其他皇后放在其他列的所有正确解
- 然后继续第一个皇后放第二列,后面继续循环执行1,2,3,4的步骤
在这里可以使用一个一维数组保存值即可,第n个数字即代表第n个皇后。(因为数组是从0开始,所以在代码中是第i个位置为第i+1个皇后)
var max = 8;
var count = 0;
const arr = new Array(8);
//初始化
for(var i=0;i<arr.length;i++){
arr[i] = 0;
}
check(0);
console.log(count);
//放置皇后
function check(n){
//如果八个皇后都遍历了就停止遍历
if(n==max){
count++;
printArr();
return;
}
//依次放入皇后并判断是否冲突
for(var i=0;i<max;i++){
arr[n] = i;
if(judge(n)){
//如果不冲突,放下一个皇后
check(n+1);
}
//如果冲突,则判断下一个位置
//如果这些位置都冲突,那么就会回溯到上一个皇后,改变其位置
}
}
//将皇后摆放的位置输出
//javaScript需要通过连接来实现在一行内输出
function printArr(){
var str = "";
for(var i=0;i<arr.length;i++){
str += arr[i]+" ";
}
console.log(str);
}
//检查各个皇后是否冲突
function judge(n){
for(var i=0;i<n;i++){
//如果列相同,并且处于同一斜线
//这里判断斜线相同就是斜率相同,也可看成判断是否是等腰直角三角形
//所以判断其两个边是否相等
if(arr[i] == arr[n] || Math.abs(n-i)==Math.abs(arr[n]-arr[i]))
return false;
}
return true;
}
本文为算法笔记,需要详细视频学习请点击以下链接