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 相关文章推荐
Add a Picture to a Microsoft Word Document
Jun 15 Javascript
formValidator3.3的ajaxValidator一些异常分析
Jul 12 Javascript
js日期对象兼容性的处理方法
Jan 28 Javascript
jquery常用操作小结
Jul 21 Javascript
jQuery中not()方法用法实例
Jan 06 Javascript
jQuery UI插件自定义confirm确认框的方法
Mar 20 Javascript
jquery制作属于自己的select自定义样式
Nov 23 Javascript
jQuery EasyUI菜单与按钮详解
Jul 13 Javascript
BootStrap+Angularjs+NgDialog实现模式对话框
Aug 24 Javascript
AngularJs ng-change事件/指令的用法小结
Nov 01 Javascript
如何优雅的在一台vps(云主机)上面部署vue+mongodb+express项目
Jan 20 Javascript
在vue项目中使用Jquery-contextmenu插件的步骤讲解
Jan 27 jQuery
使用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
为了这两部电子管收音机,买了6套全新电子管和10粒刻度盘灯泡
2021/03/02 无线电
详细介绍PHP应用提速面面观
2006/10/09 PHP
Zend Framework教程之配置文件application.ini解析
2016/03/10 PHP
PHP怎样用正则抓取页面中的网址
2016/08/09 PHP
PHP实现多级分类生成树的方法示例
2017/02/07 PHP
翻译整理的jQuery使用查询手册
2007/03/07 Javascript
jQuery阻止冒泡和HTML默认操作
2010/11/17 Javascript
js获取input标签的输入值实现代码
2013/08/05 Javascript
jQuery轮播图效果精简版完整示例
2016/09/04 Javascript
Vue中的ref作用详解(实现DOM的联动操作)
2017/08/21 Javascript
Vue2.0 实现移动端图片上传功能
2018/05/30 Javascript
AngularJS自定义表单验证功能实例详解
2018/08/24 Javascript
JavaScript使用类似break机制中断forEach循环的方法
2018/11/13 Javascript
JS实现放烟花效果
2020/03/10 Javascript
python的urllib模块显示下载进度示例
2014/01/17 Python
Python中处理字符串之islower()方法的使用简介
2015/05/19 Python
Django框架中的对象列表视图使用示例
2015/07/21 Python
Python SQLite3数据库日期与时间常见函数用法分析
2017/08/14 Python
Windows系统下多版本pip的共存问题详解
2017/10/10 Python
python验证码识别教程之灰度处理、二值化、降噪与tesserocr识别
2018/06/04 Python
pandas中DataFrame修改index、columns名的方法示例
2019/08/02 Python
python opencv实现证件照换底功能
2019/08/19 Python
Python多线程模块Threading用法示例小结
2019/11/09 Python
Python正则表达式急速入门(小结)
2019/12/16 Python
Python socket聊天脚本代码实例
2020/01/02 Python
pandas中read_csv、rolling、expanding用法详解
2020/04/21 Python
html5 冒号分隔符对齐的实现
2019/07/31 HTML / CSS
美国新兴城市生活方式零售商:VILLA
2017/12/06 全球购物
施华洛世奇日本官网:SWAROVSKI日本
2018/05/04 全球购物
中式餐厅创业计划书范文
2014/01/23 职场文书
爱国主义教育活动总结
2014/05/07 职场文书
研究生就业推荐表导师评语
2014/12/31 职场文书
毕业生就业推荐表自我评价
2015/03/02 职场文书
中学图书馆工作总结
2015/08/11 职场文书
Vue详细的入门笔记
2021/05/10 Vue.js
zabbix 代理服务器的部署与 zabbix-snmp 监控问题
2022/07/15 Servers