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 相关文章推荐
Prototype 1.5.0_rc1 及 Prototype 1.5.0 Pre0小抄本
Sep 22 Javascript
JS动态增加删除UL节点LI及相关内容示例
May 21 Javascript
一个字符串反转函数可实现字符串倒序
Sep 15 Javascript
JavaScript中string转换成number介绍
Dec 31 Javascript
jQuery实现在下拉列表选择时获取json数据的方法
Apr 16 Javascript
jQuery Real Person验证码插件防止表单自动提交
Nov 06 Javascript
使用jQuery卸载全部事件的思路详解
Apr 03 jQuery
layui表格实现代码
May 20 Javascript
图片加载完成再执行事件的实例
Nov 16 Javascript
Vue和React组件之间的传值方式详解
Jan 31 Javascript
IntelliJ IDEA编辑器配置vue高亮显示
Sep 26 Javascript
js实现拾色器插件(ColorPicker)
May 21 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
Zend framework处理一个http请求的流程分析
2010/02/08 PHP
PHP实现随机生成水印图片功能
2017/03/22 PHP
php文件包含目录配置open_basedir的使用与性能详解
2017/04/03 PHP
php 多进程编程父进程的阻塞与非阻塞实例分析
2020/02/22 PHP
利用Ext Js生成动态树实例代码
2008/09/08 Javascript
dess中一个简单的多路委托的实现
2010/07/20 Javascript
Javascript 命名空间模式
2013/11/01 Javascript
jQuery 事件的命名空间简单了解
2013/11/22 Javascript
js对文章内容进行分页示例代码
2014/03/05 Javascript
JS中判断null、undefined与NaN的方法
2014/03/24 Javascript
js使用split函数按照多个字符对字符串进行分割的方法
2015/03/20 Javascript
jQuery事件处理的特征(事件命名机制)
2016/08/23 Javascript
实例解析js中try、catch、finally的执行规则
2017/02/24 Javascript
Node.js中流(stream)的使用方法示例
2017/07/16 Javascript
使用validate.js实现表单数据提交前的验证方法
2018/09/04 Javascript
ES6 Map结构的应用实例分析
2019/06/26 Javascript
python实现批量转换文件编码(批转换编码示例)
2014/01/23 Python
Python读取mp3中ID3信息的方法
2015/03/05 Python
Python脚本实现虾米网签到功能
2016/04/12 Python
浅析Python中的getattr(),setattr(),delattr(),hasattr()
2016/06/14 Python
TensorFlow Session使用的两种方法小结
2018/07/30 Python
Django 内置权限扩展案例详解
2019/03/04 Python
Python GUI学习之登录系统界面篇
2019/08/21 Python
ansible动态Inventory主机清单配置遇到的坑
2020/01/19 Python
Python pip安装模块提示错误解决方案
2020/05/22 Python
Python迭代器协议及for循环工作机制详解
2020/07/14 Python
亚马逊新加坡官方网站:Amazon.sg
2020/03/25 全球购物
美国工业用品采购网站:Zoro.com
2020/10/27 全球购物
自主招生自荐书
2013/11/29 职场文书
小学运动会广播稿200字(十二篇)
2014/01/14 职场文书
教师新年寄语
2014/04/03 职场文书
如何撰写一封出色的求职信
2014/04/27 职场文书
志愿者宣传口号
2014/06/17 职场文书
运动会广播稿200字(10篇)
2014/10/12 职场文书
房地产工程部经理岗位职责
2015/04/09 职场文书
社区环境卫生倡议书
2015/04/29 职场文书