算法---八皇后问题

188 阅读1分钟

八皇后问题:将八个皇后摆在一张8*8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇后,一共有多少种摆法?

    返回数组 数组中的每一项表示当前项下标对应的row的当前项放置皇后的col
    例子:getSolute(4)
    返回:[[1, 3, 0, 2],[2, 0, 3, 1]] 表示有两种摆放方式 
    //n 表示x*x矩阵中的x 例如8*8皇后  n==8;
    function ab(row,n,arr,arr2) {
        if (row == n) {
            //当row已经成功走到最后一行,说明已经找到了一种解法
            arr2.push([].slice.call(arr));//找到一种解法,就把当前的位置记录下来
            arr=[];
        }
        for (var col = 0; col < n; col++) {
            if (isOk(row, col,arr)) {
                //当前行的这一列不与前几行的位置冲突,则把这个位置记录下来,位置记录下来,是为了每次循环比较是否有冲突
                arr[row] = col;
                ab(row + 1,n,arr,arr2);//进入下一行选位置,因为递归,所以当里层的循环全部结束以后,会返回上一层继续循环,实现了回溯
            }
        }
    }
    function isOk(row, col,arr) {
        for (var i = 0; i < row; i++) {
            //从第0行开始比较和当前的位置是否有冲突
            if (row == 0) {
                return true;
            }
            //假如该列有其他皇后或者在斜对角方向
            if (arr[i] == col || Math.abs(arr[i] - col) == Math.abs(i - row)) {
                return false;
            }
        }
        //成功比较完了之前的所有行,说明这个位置可以放置
        return true;
    }
    function getSolute(n){
        let arr = [];
        let arr2 = [];
        ab(0,n,arr,arr2);
        return arr2
    }
    console.warn(getSolute(8));