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 相关文章推荐
JavaScript保留两位小数的2个自定义函数
May 05 Javascript
jquery动态改变form属性提交表单
Jun 03 Javascript
Node.js的包详细介绍
Jan 14 Javascript
jquery实现下拉框功能效果【实例代码】
May 06 Javascript
第九篇Bootstrap导航菜单创建步骤详解
Jun 21 Javascript
JavaScript 实现的checkbox经典实例分享
Oct 16 Javascript
bootstrap datetimepicker2.3.11时间插件使用
Nov 19 Javascript
基于js的变量提升和函数提升(详解)
Sep 17 Javascript
jQuery zTree 异步加载添加子节点重复问题
Nov 29 jQuery
仿京东快报向上滚动的实例
Dec 13 Javascript
Vue实现active点击切换方法
Mar 16 Javascript
原生js实现无缝轮播图
Jan 11 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常量的详解
2013/06/09 PHP
Laravel实现autoload方法详解
2017/05/07 PHP
PHP迭代器接口Iterator用法分析
2017/12/28 PHP
认识延迟时间为0的setTimeout
2008/05/16 Javascript
js清除input中type等于file的值域(示例代码)
2013/12/24 Javascript
浅谈关于JavaScript API设计的一些建议和准则
2015/06/24 Javascript
jQuery插件EasyUI校验规则 validatebox验证框
2015/11/29 Javascript
jquery zTree异步加载、模糊搜索简单实例分享
2016/03/24 Javascript
每日十条JavaScript经验技巧(二)
2016/06/23 Javascript
ionic组件ion-tabs选项卡切换效果实例
2016/08/27 Javascript
JS实现倒计时(天数、时、分、秒)
2016/11/16 Javascript
ES6中箭头函数的定义与调用方式详解
2017/06/02 Javascript
Vue.js实现微信过渡动画左右切换效果
2017/06/13 Javascript
详解用vue编写弹出框组件
2017/07/04 Javascript
原生js实现简单的模态框示例
2017/09/08 Javascript
create-react-app使用antd按需加载的样式无效问题的解决
2019/02/26 Javascript
vue + any-touch实现一个iscroll 实现拖拽和滑动动画效果
2019/04/08 Javascript
如何构建 vue-ssr 项目的方法步骤
2020/08/04 Javascript
vue element-ul实现展开和收起功能的实例代码
2020/11/25 Vue.js
[02:34]DOTA2英雄基础教程 幽鬼
2014/01/02 DOTA
[06:45]2018DOTA2亚洲邀请赛 4.5 SOLO赛 Sccc vs Maybe
2018/04/06 DOTA
浅谈python脚本设置运行参数的方法
2018/12/03 Python
python中def是做什么的
2020/06/10 Python
Spanx塑身衣官网:美国知名内衣品牌
2017/01/11 全球购物
印刷工程专业应届生求职信
2013/09/29 职场文书
小学英语教学反思案例
2014/02/04 职场文书
革命先烈的英雄事迹材料
2014/02/15 职场文书
2014年德育工作总结
2014/11/20 职场文书
前台接待员岗位职责
2015/04/15 职场文书
消防隐患整改通知书
2015/04/22 职场文书
管辖权异议上诉状
2015/05/23 职场文书
《百分数的认识》教学反思
2016/02/19 职场文书
《将心比心》教学反思
2016/02/23 职场文书
如何在Python项目中引入日志
2021/05/31 Python
go开发alertmanger实现钉钉报警
2021/07/16 Golang
使用HttpSessionListener监听器实战
2022/03/17 Java/Android