八皇后问题的Javascript实现

八皇后问题的Javascript实现。
直接上代码。

/*
  八皇后问题:
  建模:
  A 皇后横直不兼容:故每一排每一列最多只能有一个皇后,故每组答案可以简化为一个数组,如:[0, 4, 7, 5, 2, 6, 1, 3]
  B 判断条件可以简化为是否存在斜吃就行。
  C 用递归实现
*/

function queens(n) {
    function isOk(arr, m) { //前m-1个皇后相安无事的情况下,判断第m个是否也相安无事
        for (var i = 0; i < m; i++) {
            if (Math.abs(arr[i] - arr[m]) == m - i) return false;
        }
        return true;
    }
    var ret = [];
    function getQueens(arr, m) {//前m-1个皇后相安无事的情况下,安排后面皇后的位置。
        arr = [...arr]
        if (m == n - 1) { //判断最后一个皇后是否和谐
            if (isOk(arr, m)) ret.push([...arr]);
            return;
        }
        for (var i = m; i < n; i++) { //递归下一轮
            var temp = arr[m];
            arr[m] = arr[i];
            arr[i] = temp;
            if (isOk(arr, m)) getQueens(arr, m + 1);
        }
    }
    var arr = [];
    for (var i = 0; i < n; i++) arr[i] = i;
    getQueens(arr, 0);
    return ret;
}

function test(n) {
    var d0 = new Date();
    var qs = queens(n);
    console.log(qs);
    var d1 = new Date();
    console.log(n + '皇后,共 ' + qs.length + ' 组解。耗时:' + (d1 - d0));
}

test(3);
test(4);
test(5);
test(6);
test(7);
test(8);
test(9);
test(10);

 

 

另:这位网友有更简洁的代码,性能上与本文代码略有差异:https://www.jb51.net/article/86413.htm 

 

posted on 2021-08-04 20:42  JKisJK  阅读(194)  评论(0编辑  收藏  举报

导航