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 相关文章推荐
javascript截取字符串小结
Apr 28 Javascript
js仿黑客帝国字母掉落效果代码分享
Nov 08 Javascript
JQuery动态添加Select的Option元素实现方法
Aug 29 Javascript
Bootstrap的popover(弹出框)2秒后定时消失的实现代码
Feb 27 Javascript
小程序红包雨的实现示例
Feb 19 Javascript
微信小程序中weui用法解析
Oct 21 Javascript
浅析vue cli3 封装Svgicon组件正确姿势(推荐)
Apr 27 Javascript
小程序瀑布流组件实现翻页与图片懒加载
May 19 Javascript
Vue 打包体积优化方案小结
May 20 Javascript
使用next.js开发网址缩短服务的方法
Jun 17 Javascript
浅谈vue使用axios的回调函数中this不指向vue实例,为undefined
Sep 21 Javascript
vue使用localStorage持久性存储实现评论列表
Apr 14 Vue.js
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
火影忍者:三大瞳力之一的白眼,为什么没有写轮眼那么出色?
2020/03/02 日漫
浅谈PHP强制类型转换,慎用!
2013/06/06 PHP
Linux系统下PHP-FPM的安装和配置教程
2015/08/17 PHP
PHP 500报错的快速解决方法
2016/12/14 PHP
php中pcntl_fork创建子进程的方法实例
2019/03/14 PHP
确保Laravel网站不会被嵌入到其他站点中的方法
2019/10/18 PHP
XMLHTTPRequest的属性和方法简介
2010/11/23 Javascript
javascript学习笔记(七) js函数介绍
2012/06/19 Javascript
JavaScript NaN和Infinity特殊值 [译]
2012/09/20 Javascript
JS验证日期的格式YYYY-mm-dd 具体实现
2013/06/29 Javascript
jQuery实现滑动页面固定顶部显示(可根据显示位置消失与替换)
2015/10/28 Javascript
JavaScript中访问id对象 属性的方式访问属性(实例代码)
2016/10/28 Javascript
Node.JS中事件轮询(Event Loop)的解析
2017/02/25 Javascript
Node.js之网络通讯模块实现浅析
2017/04/01 Javascript
vue地址栏直接输入路由无效问题的解决
2018/11/15 Javascript
微信小程序局部刷新触发整页刷新效果的实现代码
2018/11/21 Javascript
深入浅出了解Node.js Streams
2019/05/27 Javascript
python 运算符 供重载参考
2009/06/11 Python
Python生成不重复随机值的方法
2015/05/11 Python
Python中的迭代器与生成器高级用法解析
2016/06/28 Python
python 打印直角三角形,等边三角形,菱形,正方形的代码
2017/11/21 Python
python3实现公众号每日定时发送日报和图片
2018/02/24 Python
python使用turtle绘制分形树
2018/06/22 Python
python 机器学习之支持向量机非线性回归SVR模型
2019/06/26 Python
django框架使用方法详解
2019/07/18 Python
Python中的 ansible 动态Inventory 脚本
2020/01/19 Python
给ubuntu18安装python3.7的详细教程
2020/06/08 Python
HTML5 绘制图像(上)之:关于canvas元素引领下一代web页面的问题
2013/04/24 HTML / CSS
HTML5中的网络存储实现方式
2020/04/28 HTML / CSS
高中毕业自我鉴定范文
2013/10/02 职场文书
企业道德讲堂实施方案
2014/03/19 职场文书
农民工工资支付承诺函
2014/03/31 职场文书
建筑施工安全责任书
2014/07/24 职场文书
研讨会通知
2015/04/27 职场文书
小区物业管理2015年度工作总结
2015/10/22 职场文书
自动在Windows中运行Python脚本并定时触发功能实现
2021/09/04 Python