JavaScript实现N皇后问题算法谜题解答


Posted in Javascript onDecember 29, 2014

谜题

N皇后问题。将N个皇后放置在NxN的国际象棋棋盘上,其中没有任何两个皇后处于同一行、同一列或同一对角线上,以使得它们不能互相攻击。

策略

回溯法。

JavaScript解

以8皇后问题为例:

/**

 * Created by cshao on 12/28/14.

 */
function getNQueens(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++) {

    if (nQueens[row] === undefined) {

      nQueens[row] = [];

    }
    for (var col=0; col<order; col++) {

      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;

        }

        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;

        resetRow(nQueens, order, row);

        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++) {

    if (nQueens[row-j][col]==1 || (nQueens[row-j][col-j]!=undefined && nQueens[row-j][col-j]==1) || (nQueens[row-j][col+j]!=undefined && nQueens[row-j][col+j]==1)) {

      return false;

    }

  }

  return true;

}
function printQueens(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 = getNQueens(8);

printQueens(queens);

结果

1  0  0  0  0  0  0  0  

0  0  0  0  1  0  0  0  

0  0  0  0  0  0  0  1  

0  0  0  0  0  1  0  0  

0  0  1  0  0  0  0  0  

0  0  0  0  0  0  1  0  

0  1  0  0  0  0  0  0  

0  0  0  1  0  0  0  0
Javascript 相关文章推荐
jQuery使用手册之三 CSS操作
Mar 24 Javascript
jquery keypress,keyup,onpropertychange键盘事件
Jun 25 Javascript
JavaScript中的undefined学习总结
Nov 30 Javascript
详细解密jsonp跨域请求
Apr 15 Javascript
coffeescript使用的方式汇总
Aug 05 Javascript
Bootstrap每天必学之导航条(二)
Mar 01 Javascript
详解JavaScript表单验证(E-mail 验证)
Mar 31 Javascript
jQuery插件FusionCharts实现的2D柱状图效果示例【附demo源码下载】
Mar 06 Javascript
如何解决vue与传统jquery插件冲突
Mar 20 Javascript
zTree获取当前节点的下一级子节点数实例
Sep 05 Javascript
AngularJS实现的select二级联动下拉菜单功能示例
Oct 25 Javascript
Vue props用法详解(小结)
Jul 03 Javascript
jQuery中dequeue()方法用法实例
Dec 29 #Javascript
jQuery中queue()方法用法实例
Dec 29 #Javascript
浅谈JavaScript function函数种类
Dec 29 #Javascript
JavaScript异步加载浅析
Dec 28 #Javascript
JavaScript设计模式之工厂方法模式介绍
Dec 28 #Javascript
JavaScript设计模式之抽象工厂模式介绍
Dec 28 #Javascript
JavaScript设计模式之单件模式介绍
Dec 28 #Javascript
You might like
PHP的array_diff()函数在处理大数组时的效率问题
2011/11/27 PHP
php简单开启gzip压缩方法(zlib.output_compression)
2013/04/13 PHP
PHP实现Soap通讯的方法
2014/11/03 PHP
PHP使用mysqldump命令导出数据库
2015/04/14 PHP
PHP中SESSION的注销与清除
2015/04/16 PHP
PHP中的Trait 特性及作用
2016/04/03 PHP
麻雀虽小五脏俱全 Dojo自定义控件应用
2010/09/04 Javascript
jquery blockUI 遮罩不能消失与不能提交的解决方法
2011/09/17 Javascript
js取消单选按钮选中示例代码
2013/11/14 Javascript
Node.js中HTTP模块与事件模块详解
2014/11/14 Javascript
使用jquery动态加载js文件的方法
2014/12/24 Javascript
coffeescript使用的方式汇总
2015/08/05 Javascript
全面解析Bootstrap弹窗的实现方法
2015/12/01 Javascript
使用JQuery中的trim()方法去掉前后空格
2016/09/16 Javascript
JavaScript中的工厂函数(推荐)
2017/03/08 Javascript
vue.js指令v-model使用方法
2017/03/20 Javascript
js实现不提示直接关闭网页窗口
2017/03/30 Javascript
基于js的变量提升和函数提升(详解)
2017/09/17 Javascript
JS实现预加载视频音频/视频获取截图(返回canvas截图)
2017/10/09 Javascript
微信小程序实现的canvas合成图片功能示例
2019/05/03 Javascript
[01:44]剑指西雅图 展望TI之CIS战队专访
2014/06/25 DOTA
[44:09]DOTA2上海特级锦标赛A组小组赛#1 EHOME VS MVP.Phx第二局
2016/02/25 DOTA
简单上手Python中装饰器的使用
2015/07/12 Python
python基于隐马尔可夫模型实现中文拼音输入
2016/04/01 Python
python实现二分查找算法
2017/09/21 Python
Python GUI自动化实现绕过验证码登录
2020/01/10 Python
通过Turtle库在Python中绘制一个鼠年福鼠
2020/02/03 Python
利用PyQt5+Matplotlib 绘制静态/动态图的实现代码
2020/07/13 Python
Python如何定义有默认参数的函数
2020/08/10 Python
经贸日语毕业生自荐信
2013/11/03 职场文书
学生会宣传部部长竞选演讲稿
2014/04/25 职场文书
事业单位财务人员岗位职责
2015/04/14 职场文书
暑期工社会实践报告
2015/07/13 职场文书
2016北大自主招生自荐信模板
2016/01/28 职场文书
Python Pandas pandas.read_sql_query函数实例用法分析
2021/06/21 Python
vue实现input输入模糊查询的三种方式
2022/08/14 Vue.js