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 相关文章推荐
使用TextRange获取输入框中光标的位置的代码
Mar 08 Javascript
jquery CSS选择器笔记
Mar 29 Javascript
JavaScript网页定位详解
Jan 13 Javascript
Javascript学习笔记之 函数篇(二) : this 的工作机制
Jun 24 Javascript
Jquery设置attr的disabled属性控制某行显示或者隐藏
Sep 25 Javascript
js添加select下默认的option的value和text的方法
Oct 19 Javascript
多个jQuery版本共存的处理方案
Mar 17 Javascript
Jsonp 关键字详解及json和jsonp的区别,ajax和jsonp的区别
Dec 30 Javascript
EasyUI框架 使用Ajax提交注册信息的实现代码
Sep 27 Javascript
vue2.0实现前端星星评分功能组件实例代码
Feb 12 Javascript
vue-cli 引入、配置axios的方法
May 08 Javascript
详解Webpack多环境代码打包的方法
Aug 03 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中一个控制字符串输出的函数
2006/10/09 PHP
php+curl 发送图片处理代码分享
2015/07/09 PHP
php如何获取文件的扩展名
2015/10/28 PHP
php实现分页显示
2015/11/03 PHP
PHP Yii框架之表单验证规则大全
2015/11/16 PHP
不安全的常用的js写法
2009/09/15 Javascript
js自动闭合html标签(自动补全html标记)
2012/10/04 Javascript
JS循环遍历JSON数据的方法
2014/07/08 Javascript
JavaScript检测浏览器cookie是否已经启动的方法
2015/02/27 Javascript
图解Sublime Text3使用技巧
2015/12/21 Javascript
JS实现获取剪贴板内容的方法
2016/06/21 Javascript
JavaScript事件用法浅析
2016/10/31 Javascript
给easyui datebox扩展一个清空的实例
2016/11/09 Javascript
jQuery通过改变input的type属性实现密码显示隐藏切换功能
2017/02/08 Javascript
微信小程序  TLS 版本必须大于等于1.2问题解决
2017/02/22 Javascript
基于JavaScript定位当前的地理位置
2017/04/11 Javascript
jQuery制作全屏宽度固定高度轮播图(实例讲解)
2017/07/08 jQuery
Vue基于NUXT的SSR详解
2017/10/24 Javascript
深入理解NodeJS 多进程和集群
2018/10/17 NodeJs
基于javascript的拖拽类封装详解
2019/04/19 Javascript
Python中的jquery PyQuery库使用小结
2014/05/13 Python
Python中的默认参数详解
2015/06/24 Python
Python获取当前路径实现代码
2017/05/08 Python
浅谈flask源码之请求过程
2018/07/26 Python
在keras里面实现计算f1-score的代码
2020/06/15 Python
纯css3实现思维导图样式示例
2018/11/01 HTML / CSS
米兰网婚纱礼服法国网上商店:Milanoo法国
2016/08/20 全球购物
加拿大最大的相机店:Henry’s
2017/05/17 全球购物
计算机网络毕业生自荐信
2013/10/01 职场文书
体育专业学生自我评价范文
2014/01/17 职场文书
三方合作协议书范本
2014/04/18 职场文书
我读书我快乐演讲稿
2014/05/07 职场文书
网络营销策划方案
2014/06/04 职场文书
开发房地产协议书
2014/09/14 职场文书
幼儿园老师新年寄语
2015/08/17 职场文书
基于Python实现流星雨效果的绘制
2022/03/18 Python