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 相关文章推荐
js 单引号 传递方法
Jun 22 Javascript
JSON JQUERY模板实现说明
Jul 03 Javascript
javascript级联下拉列表实例代码(自写)
May 10 Javascript
JavaScript子类用Object.getPrototypeOf去调用父类方法解析
Dec 05 Javascript
jquery中对于批量deferred的处理方法
Jan 22 Javascript
js拼接html注意问题示例探讨
Jul 14 Javascript
Bootstrap实现带暂停功能的轮播组件(推荐)
Nov 25 Javascript
超全面的vue.js使用总结
Feb 12 Javascript
JavaScript基本语法_动力节点Java学院整理
Jun 26 Javascript
jQuery接受后台传递的List的实例详解
Aug 02 jQuery
Angular实现svg和png图片下载实现
May 05 Javascript
PHP读取远程txt文档到数组并实现遍历
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中10个不常见却非常有用的函数
2010/03/21 PHP
浅析虚拟主机服务器php fsockopen函数被禁用的解决办法
2013/08/07 PHP
PHP中使用array函数新建一个数组
2015/11/19 PHP
PHP结合Jquery和ajax实现瀑布流特效
2016/01/07 PHP
PHP中的使用curl发送请求(GET请求和POST请求)
2017/02/08 PHP
javascript 进阶篇3 Ajax 、JSON、 Prototype介绍
2012/03/14 Javascript
js 调用百度地图api并在地图上进行打点添加标注
2014/05/13 Javascript
ie8模式下click无反应点击option无反应的解决方法
2014/10/11 Javascript
jQuery修改class属性和CSS样式整理
2015/01/30 Javascript
JavaScript实现表格点击排序的方法
2015/05/11 Javascript
Jquery实现动态切换图片的方法
2015/05/18 Javascript
有关JavaScript中call()和apply() 的一些理解
2016/05/20 Javascript
深入浅出讲解ES6的解构
2016/08/03 Javascript
Bootstrap组合上、下拉框简单实现代码
2017/03/06 Javascript
JavaScript定时器使用方法详解
2020/03/26 Javascript
vue-cli3项目配置eslint代码规范的完整步骤
2020/09/10 Javascript
[02:11]DOTA2上海特级锦标赛主赛事第二日RECAP
2016/03/04 DOTA
Python ZipFile模块详解
2013/11/01 Python
Python学习笔记_数据排序方法
2014/05/22 Python
解决python3在anaconda下安装caffe失败的问题
2017/06/15 Python
Python协程的用法和例子详解
2017/09/09 Python
对PyQt5中树结构的实现方法详解
2019/06/17 Python
Python Django 页面上展示固定的页码数实现代码
2019/08/21 Python
pytorch之Resize()函数具体使用详解
2020/02/27 Python
matplotlib之多边形选区(PolygonSelector)的使用
2021/02/24 Python
CSS3实现div从下往上滑入滑出效果示例
2020/04/28 HTML / CSS
马来西亚网上购物:Youbeli
2018/03/30 全球购物
Everything But Water官网:美国泳装品牌
2019/03/17 全球购物
入党自我鉴定范文
2013/10/04 职场文书
结婚喜宴家长答谢词
2014/01/15 职场文书
创建文明学校实施方案
2014/03/11 职场文书
党的群众路线教育实践活动总结报告
2014/07/03 职场文书
产品委托授权书范本
2014/09/16 职场文书
学习教师敬业奉献模范事迹材料思想汇报
2014/09/19 职场文书
党员个人剖析材料2014
2014/10/08 职场文书
党员批评与自我批评思想汇报
2014/10/08 职场文书