JS算法之8皇后算法
8皇后算法算是回溯算法中很典型的案例,算法要求是在一个8x8的棋盘上,同一行同一列,并且斜线上不能同时有皇后,问在这个棋盘上放8个皇后有多少种方法?
0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | |
---|---|---|---|---|---|---|---|---|
0 | ||||||||
1 | ||||||||
2 | ||||||||
3 | ||||||||
4 | ||||||||
5 | ||||||||
6 | ||||||||
7 |
假设第一个皇后在第一个位置
那么,此时的行和列以及斜线都不能再有皇后
那么我们就得从第二行开始找第二个皇后,然后用同样的判断规则来找下一个皇后,直到8个皇后全部找到
对于第一行而言,我们的第一个皇后可以在不同的位置,相对于的,每一个皇后的位置都有一个或多个选择,这时候我们就需要遍历整个棋盘来找出所有的皇后,遇见不符合规则的位置时需要返回到上一步重新选择皇后的位置,
我们需要枚举所有的搜索路径,当发现不满足求解条件时吗,就回溯到上一步,所以说8皇后算法也是回溯算法很典型的一个案例
js实现8皇后
function eightqueen(){
var arr=[];
var n=8;//8x8
function queen(row){//行
if(row>n){//判断皇后数
var result=arr.map(item=>item.y)
console.log(result);
// console.log(arr)
}
for(var i=1;i<=n;i++){//列
if(row===1||count(row,i)){//第一次循环进来时,第一个皇后的位置就是1,1
arr[row-1]={x:row,y:i}//满足条件的皇后坐标保存
queen(row+1)
}
}
}
function count(lx,ly){
for(var a=1;a<lx;a++){
if(ly==arr[a-1].y||Math.abs(lx-arr[a-1].x)==Math.abs(ly-arr[a-1].y))//判断条件
return false;
}
return true;
}
queen(1)//
}
eightqueen()