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 相关文章推荐
Some tips of wmi scripting in jscript (1)
Apr 03 Javascript
面向对象的javascript(笔记)
Oct 06 Javascript
js 使用form表单select类实现级联菜单效果
Dec 19 Javascript
基于JavaScript实现继承机制之调用call()与apply()的方法详解
May 07 Javascript
JS文本获得焦点清除文本文字的示例代码
Jan 13 Javascript
AngularJS入门教程之学习环境搭建
Dec 06 Javascript
使用javascript实现json数据以csv格式下载
Jan 09 Javascript
在node.js中怎么屏蔽掉favicon.ico的请求
Mar 01 Javascript
完美解决spring websocket自动断开连接再创建引发的问题
Mar 02 Javascript
微信小程序 下拉菜单简单实例
Apr 13 Javascript
Vue.js 实现数据展示全部和收起功能
Sep 05 Javascript
vue实现户籍管理系统
May 29 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
通过curl模拟post和get方式提交的表单类
2014/04/23 PHP
PHP中读取文件的8种方法和代码实例
2014/08/05 PHP
PHP中shuffle数组值随便排序函数用法
2014/11/21 PHP
屏蔽PHP默认设置中的Notice警告的方法
2016/05/20 PHP
PHP共享内存使用与信号控制实例分析
2018/05/09 PHP
PHP getName()函数讲解
2019/02/03 PHP
Javascript下的keyCode键码值表
2007/04/10 Javascript
javaScript 简单验证代码(用户名,密码,邮箱)
2009/09/28 Javascript
商城常用滚动的焦点图效果代码简单实用
2013/03/28 Javascript
jQuery父级以及同级元素查找介绍
2013/09/04 Javascript
jquery实现超简洁的TAB选项卡效果代码
2015/08/28 Javascript
jquery验证手机号是否正确实例讲解
2015/11/17 Javascript
JavaScript实现搜索框的自动完成功能(一)
2016/02/25 Javascript
jquery实现下拉框多选方法介绍
2017/01/03 Javascript
js获取当前页的URL与window.location.href简单方法
2017/02/13 Javascript
Bootstrap显示与隐藏简单实现代码
2017/03/06 Javascript
JavaScript创建对象的七种方式(推荐)
2017/06/26 Javascript
原生JS实现多个小球碰撞反弹效果示例
2018/01/31 Javascript
vue使用iframe嵌入网页的示例代码
2020/06/09 Javascript
使用RN Animated做一个“添加购物车”动画的方法
2018/09/12 Javascript
vue路由传参的基本实现方式小结【三种方式】
2020/02/05 Javascript
OpenLayers3实现鼠标移动显示坐标
2020/09/25 Javascript
vue实现登录功能
2020/12/31 Vue.js
Selenium鼠标与键盘事件常用操作方法示例
2018/08/13 Python
一文带你了解Python中的字符串是什么
2018/11/20 Python
python实现蒙特卡罗方法教程
2019/01/28 Python
Pandas读取并修改excel的示例代码
2019/02/17 Python
Python如何爬取实时变化的WebSocket数据的方法
2019/03/09 Python
解决c++调用python中文乱码问题
2020/07/29 Python
Python远程linux执行命令实现
2020/11/11 Python
Python模拟登录requests.Session应用详解
2020/11/17 Python
HTML5验证以及日期显示的实现详解
2013/07/05 HTML / CSS
廉洁自律承诺书
2014/03/27 职场文书
安全教育演讲稿
2014/05/09 职场文书
违章停车检讨书
2014/10/21 职场文书
浅谈redis五大数据结构和使用场景
2021/04/12 Redis