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 相关文章推荐
FireFox JavaScript全局Event对象
Jun 14 Javascript
jquery 简单的进度条实现代码
Mar 11 Javascript
jquery使用ul模拟select实现表单美化的方法
Aug 18 Javascript
jQuery实现简易的天天爱消除小游戏
Oct 16 Javascript
javascript学习指南之回调问题
Apr 23 Javascript
JS获取鼠标选中的文字
Aug 10 Javascript
Angular2学习笔记——详解NgModule模块
Dec 02 Javascript
详解Jquery 遍历数组之$().each方法与$.each()方法介绍
Jan 09 Javascript
Bootstrap实现渐变顶部固定自适应导航栏
Aug 27 Javascript
轻松理解JavaScript闭包
Mar 14 Javascript
微信小程序学习笔记之登录API与获取用户信息操作图文详解
Mar 29 Javascript
React实现轮播效果
Aug 25 Javascript
使用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
php自定义hash函数实例
2015/05/05 PHP
PHP快速导出百万级数据到CSV或者EXCEL文件
2020/11/27 PHP
javascript 实现父窗口引用弹出窗口的值的脚本
2007/08/07 Javascript
关于全局变量和局部变量的那些事
2013/01/11 Javascript
jQuery1.9.1针对checkbox的调整方法(prop)
2014/05/01 Javascript
JavaScript阻止浏览器返回按钮的方法
2015/03/18 Javascript
jQuery找出网页上最高元素的方法
2015/03/20 Javascript
js图片轮播特效代码分享
2015/09/07 Javascript
GitHub上一些实用的JavaScript的文件压缩解压缩库推荐
2016/03/13 Javascript
Boostrap入门准备之border box
2016/05/09 Javascript
jquery表单插件Autotab使用方法详解
2016/06/24 Javascript
一篇文章搞定JavaScript类型转换(面试常见)
2017/01/21 Javascript
nodejs中全局变量的实例解析
2017/03/07 NodeJs
微信小程序 页面跳转如何实现传值
2017/04/05 Javascript
vue打包后显示空白正确处理方法
2017/11/01 Javascript
详解如何在微信小程序开发中正确的使用vant ui组件
2018/09/13 Javascript
es6 super关键字的理解与应用实例分析
2020/02/15 Javascript
JavaScript 空间坐标的使用
2020/08/19 Javascript
[01:05:30]VP vs TNC 2018国际邀请赛小组赛BO2 第一场 8.17
2018/08/20 DOTA
详解python实现读取邮件数据并下载附件的实例
2017/08/03 Python
django模板结构优化的方法
2019/02/28 Python
简单介绍python封装的基本知识
2019/08/10 Python
Python学习笔记之Zip和Enumerate用法实例分析
2019/08/14 Python
python实现静态服务器
2019/09/05 Python
python GUI库图形界面开发之PyQt5布局控件QHBoxLayout详细使用方法与实例
2020/03/06 Python
python+adb+monkey实现Rom稳定性测试详解
2020/04/23 Python
pytorch VGG11识别cifar10数据集(训练+预测单张输入图片操作)
2020/06/24 Python
Keras loss函数剖析
2020/07/06 Python
学年末自我鉴定
2014/01/21 职场文书
大学生简历求职信
2014/06/24 职场文书
学校总务处领导干部个人对照检查材料思想汇报
2014/10/06 职场文书
三傻大闹宝莱坞观后感
2015/06/03 职场文书
2016开学第一课心得体会
2016/01/23 职场文书
解决goland 导入项目后import里的包报红问题
2021/05/06 Golang
WINDOWS 64位 下安装配置mysql8.0.25最详细的教程
2022/03/22 MySQL
《艾尔登法环》1.03.3补丁上线 碎星伤害调整
2022/04/07 其他游戏