javascript递归回溯法解八皇后问题


Posted in Javascript onApril 22, 2015

下面给大家分享的是回溯法解八皇后, 带详细注解,这里就不多废话了。

function NQueens(order) {
  if (order < 4) {
    console.log('N Queens problem apply for order bigger than 3 ! ');
    return;
  }

  var nQueens = [];
  var backTracking = false;
  rowLoop:
    for (var row=0; row<order; row++) {
      //若出现row小于0, 则说明问题无解
      if(row < 0){
        console.log('This N Queens problem has no solution ! ');
        break;
      }
      //第一次检测到新的一行
      if (nQueens[row] === undefined) {
        nQueens[row] = [];
      }
      //回溯时运行的程序块
      for (var col=0; col<order; col++) {
        //0为已经检测过并为能放置皇后的位置
        if (nQueens[row][col] === 0) {
          continue;
        }
        //回溯过程中,遇到能放皇后的位置,说明这个位置在后面的验证没有通过,需要重新处理
        else if (backTracking && nQueens[row][col] == 1) {
          //回溯时发现,上一行也到行末,需要继续回溯
          if (col === order-1) {
            resetRow(nQueens, order, row);
            row = row - 2;
            continue rowLoop;
          }
          //回溯的行还没到行尾, 标0, 继续
          nQueens[row][col] = 0;
          backTracking = false;
          continue;
        }
        //放置一个皇后
        nQueens[row][col] = 1;
        //找到一个可以放置皇后的位置,跳出到下一行(一行上只能放一个皇后)。
        if (isQueenValid(nQueens, row, col)) {   
          continue rowLoop;
        }
        //每一行都应该有一个皇后,到列尾了还没有找到合适的位置,说明前面的皇后放置有问题,需要回溯!
        else if (col == order-1) {       
          backTracking = true;
          //0与1都表示这个位置已经检测过,因此要将本行清为undefined
          resetRow(nQueens, order, row);
          //减2是因为循环尾还有个自加,其实就是回到上一行
          row = row - 2;
          //退到外层循环,继续
          continue rowLoop;           
        } else {
          //未到行未,继续检测未检测过的
          nQueens[row][col] = 0;        
          continue;
        };
      }
    }
  return nQueens;
}
//回溯前, 将本行清除
function resetRow(nQueens, order, row) {
  for (var col=0; col<order; col++) {
    nQueens[row][col] = undefined;
  }
}
//检测位置是否能放置皇后
function isQueenValid(nQueens, row, col) {
  //行检测
  for (var i=0; i<col; i++) {
    if (nQueens[row][i] == 1) {
      return false;
    }
  }
  for (var j=1; j<row+1; j++) {
    //   列检测           左上45度             右上45度
    if (nQueens[row-j][col]==1 || (nQueens[row-j][col-j]==1) || (nQueens[row-j][col+j]==1)) {
      return false;
    }
  }
  return true;
}

function printQ(queens) {
  for (var row=0; row<queens.length; row++) {
    var rowText = '';
    for (var col=0; col<queens.length; col++) {
      if (queens[row][col]===undefined) {
        queens[row][col] = 0;
      }
      rowText = rowText + queens[row][col] + ' ';
    }
    console.log(rowText);
  }
}

var queens = NQueens(8);
printQ(queens);

以上就是本文的全部内容了,希望大家能够喜欢。

Javascript 相关文章推荐
jquery multiSelect 多选下拉框
Jul 09 Javascript
js中top、clientTop、scrollTop、offsetTop的区别 文字详细说明版
Jan 08 Javascript
node.js中的fs.fsync方法使用说明
Dec 15 Javascript
Javascript中判断对象是否为空
Jun 10 Javascript
Bootstrap树形菜单插件TreeView.js使用方法详解
Nov 01 Javascript
Bootstrap CSS布局之图像
Dec 17 Javascript
jquery 给动态生成的标签绑定事件的几种方法总结
Feb 24 jQuery
从零开始在NPM上发布一个Vue组件的方法步骤
Dec 20 Javascript
微信小程序缓存支持二次开发封装实现解析
Dec 16 Javascript
基于javascript的无缝滚动动画1
Aug 07 Javascript
JS中队列和双端队列实现及应用详解
Sep 29 Javascript
vue实现两个区域滚动条同步滚动
Dec 13 Vue.js
使用C++为node.js写扩展模块
Apr 22 #Javascript
node.js 使用ejs模板引擎时后缀换成.html
Apr 22 #Javascript
JavaScript模拟深蓝vs卡斯帕罗夫的国际象棋对局示例
Apr 22 #Javascript
jscript读写二进制文件的方法
Apr 22 #Javascript
javascript格式化json显示实例分析
Apr 21 #Javascript
JavaScript汉诺塔问题解决方法
Apr 21 #Javascript
JavaScript让网页出现渐隐渐显背景颜色的方法
Apr 21 #Javascript
You might like
乐信RP2100的电路分析和打磨
2021/03/02 无线电
Yii核心验证器api详解
2016/11/23 PHP
php-beanstalkd消息队列类实例分享
2017/07/19 PHP
php实现的pdo公共类定义与用法示例
2017/07/19 PHP
针对thinkPHP5框架存储过程bug重写的存储过程扩展类完整实例
2018/06/16 PHP
JavaScript必知必会(三) String .的方法来自何方
2016/06/08 Javascript
Angular懒加载机制刷新后无法回退的快速解决方法
2016/08/30 Javascript
微信小程序 免费SSL证书https、TLS版本问题的解决办法
2016/12/14 Javascript
js正则表达式惰性匹配和贪婪匹配用法分析
2016/12/26 Javascript
nodejs入门教程三:调用内部和外部方法示例
2017/04/24 NodeJs
浅谈angular4生命周期钩子
2017/09/05 Javascript
vue下使用nginx刷新页面404的问题解决
2019/08/02 Javascript
JavaScript 截取字符串代码实例
2019/09/05 Javascript
利用layer实现表单完美验证的方法
2019/09/26 Javascript
[01:58]DOTA2上海特级锦标赛现场采访:RTZ这个ID到底好不好
2016/03/25 DOTA
Python 拷贝对象(深拷贝deepcopy与浅拷贝copy)
2008/09/06 Python
python 定义n个变量方法 (变量声明自动化)
2018/11/10 Python
python 实现UTC时间加减的方法
2018/12/31 Python
使用Python3内置文档高效学习以及官方中文文档
2019/05/19 Python
Python处理时间日期坐标轴过程详解
2019/06/25 Python
详解python itertools功能
2020/02/07 Python
浅谈keras中的目标函数和优化函数MSE用法
2020/06/10 Python
python操作微信自动发消息的实现(微信聊天机器人)
2020/07/14 Python
idea2020手动安装python插件的实现方法
2020/07/17 Python
SmartBuyGlasses台湾:名牌眼镜,名牌太阳眼镜及隐形眼镜
2017/01/04 全球购物
印度化妆品购物网站:Nykaa
2018/07/22 全球购物
描述内存分配方式以及它们的区别
2016/10/15 面试题
自荐信格式
2013/12/01 职场文书
考核评语大全
2014/04/29 职场文书
计划生育宣传标语
2014/06/21 职场文书
关于感谢信的范文
2015/01/23 职场文书
党员自我评价2015
2015/03/03 职场文书
领导激励员工的演讲稿,各种会上用得到,建议收藏
2019/08/13 职场文书
详解nginx location指令
2022/01/18 Servers
一文搞懂Redis中String数据类型
2022/04/03 Redis
Dubbo+zookeeper搭配分布式服务的过程详解
2022/04/03 Java/Android