• 八皇后问题的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 

  • 相关阅读:
    面向对象编程听高翔“面向对象与生活”有感
    .Net调试技巧
    关于排序(简单)
    Http Handler由IIS6到IIS7的使用问题
    也谈【关于 京东员工被离职】另一个角度
    poj1062昂贵的聘礼
    poj1125 Stockbroker Grapevine
    poj1860 Currency Exchange
    poj1258 AgriNet
    poj2485 Highways
  • 原文地址:https://www.cnblogs.com/jkisjk/p/bahuanghou.html
Copyright © 2020-2023  润新知