JS算法之8皇后

548 阅读1分钟

JS算法之8皇后算法

​ 8皇后算法算是回溯算法中很典型的案例,算法要求是在一个8x8的棋盘上,同一行同一列,并且斜线上不能同时有皇后,问在这个棋盘上放8个皇后有多少种方法?

01234567
0
1
2
3
4
5
6
7

假设第一个皇后在第一个位置

image.png 那么,此时的行和列以及斜线都不能再有皇后

image.png

那么我们就得从第二行开始找第二个皇后,然后用同样的判断规则来找下一个皇后,直到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()