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面向对象程序设计三 原型模式(上)
Dec 21 Javascript
javascript简易缓动插件(源码打包)
Feb 16 Javascript
纯js网页画板(Graphics)类简介及实现代码
Dec 24 Javascript
jquery实现标签上移、下移、置顶
Apr 26 Javascript
vue.js将unix时间戳转换为自定义时间格式
Jan 03 Javascript
js验证手机号、密码、短信验证码代码工具类
Jun 24 Javascript
xmlplus组件设计系列之分隔框(DividedBox)(8)
May 02 Javascript
微信小程序实现瀑布流布局与无限加载的方法详解
May 12 Javascript
webstorm添加vue.js支持的方法教程
Jul 05 Javascript
JS实现的input选择图片本地预览功能示例
Aug 29 Javascript
微信小程序实现Swiper轮播图效果
Nov 22 Javascript
微信小程序上传帖子的实例代码(含有文字图片的微信验证)
Jul 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实现的简易版图片相似度比较
2015/01/07 PHP
PHP中调用SVN命令更新网站方法
2015/01/07 PHP
php中动态调用函数的方法
2015/03/16 PHP
PHP curl模拟登录带验证码的网站
2015/11/30 PHP
js禁止页面刷新禁止用F5键刷新禁止右键的示例代码
2013/09/23 Javascript
js随机生成26个大小写字母
2016/02/12 Javascript
javascript实现PC网页里的拖拽效果
2016/03/14 Javascript
jQuery中选择器的基础使用教程
2016/05/23 Javascript
jQuery中弹出iframe内嵌页面元素到父页面并全屏化的实例代码
2016/12/27 Javascript
bootstrap table实现x-editable的行单元格编辑及解决数据Empty和支持多样式问题
2017/08/10 Javascript
如何选择适合你的JavaScript框架
2017/11/20 Javascript
解决vue2中使用axios http请求出现的问题
2018/03/05 Javascript
vue中实现左右联动的效果
2018/06/22 Javascript
详解vscode中vue代码颜色插件
2018/10/11 Javascript
浅谈vue.use()方法从源码到使用
2019/05/12 Javascript
JavaScript遍历数组和对象的元素简单操作示例
2019/07/09 Javascript
vue 实现滚动到底部翻页效果(pc端)
2019/07/31 Javascript
vue+webpack dev本地调试全局样式引用失效的解决方案
2019/11/12 Javascript
python检查序列seq是否含有aset中项的方法
2015/06/30 Python
Python实现大文件排序的方法
2015/07/10 Python
Python爬虫之正则表达式基本用法实例分析
2018/08/08 Python
python模拟键盘输入 切换键盘布局过程解析
2019/08/15 Python
Python代码生成视频的缩略图的实例讲解
2019/12/22 Python
python print 格式化输出,动态指定长度的实现
2020/04/12 Python
Python如何脚本过滤文件中的注释
2020/05/27 Python
Python3安装模块报错Microsoft Visual C++ 14.0 is required的解决方法
2020/07/28 Python
python 深度学习中的4种激活函数
2020/09/18 Python
Pyqt助手安装PyQt5帮助文档过程图解
2020/11/20 Python
Sofft鞋官网:世界知名鞋类品牌
2017/03/28 全球购物
人力资源作业细则
2014/03/03 职场文书
安全承诺书格式
2014/05/21 职场文书
中秋节慰问信
2015/02/15 职场文书
2015年社区综治工作总结
2015/04/21 职场文书
公司开业主持词
2015/07/02 职场文书
Vue Element UI自定义描述列表组件
2021/05/18 Vue.js
pd.DataFrame中的几种索引变换的实现
2022/06/16 Python