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 相关文章推荐
window.open被浏览器拦截后的自定义提示效果代码
Nov 19 Javascript
提高网站信任度的技巧
Oct 17 Javascript
JS 面向对象的5钟写法
Jul 31 Javascript
Jquery作者John Resig自己封装的javascript 常用函数
Nov 09 Javascript
设置checkbox为只读(readOnly)的两种方式
Oct 11 Javascript
js校验表单后提交表单的三种方法总结
Feb 28 Javascript
JS判断客户端是手机还是PC的2个代码
Apr 12 Javascript
jQuery获取checkboxlist的value值的方法
Sep 27 Javascript
详解JavaScript对Date对象的操作问题(生成一个倒数7天的数组)
Oct 01 Javascript
seajs中最常用的7个功能、配置示例
Oct 10 Javascript
mui back 返回刷新页面的实例
Dec 06 Javascript
vue中axios的二次封装实例讲解
Oct 14 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
实用函数10
2007/11/08 PHP
windows7下php开发环境搭建图文教程
2015/01/06 PHP
使用PHP和JavaScript判断请求是否来自微信内浏览器
2015/08/18 PHP
详解PHP编码转换函数应用技巧
2016/10/22 PHP
php利用gd库为图片添加水印
2016/11/09 PHP
Mac下关于PHP环境和扩展的安装详解
2019/10/17 PHP
关于Anemometer图形化显示MySQL慢日志的工具搭建及使用的详细介绍
2020/07/13 PHP
jquery的flexigrid无法显示数据提示获取到数据
2013/07/19 Javascript
javaScript面向对象继承方法经典实现
2013/08/20 Javascript
javascript操作css属性
2013/12/30 Javascript
jquery form表单序列化为对象的示例代码
2014/03/05 Javascript
javascript打开word文档的方法
2014/04/16 Javascript
jQuery学习笔记之2个小技巧
2015/01/19 Javascript
jQuery 全选 全部选 反选 实现代码
2016/08/17 Javascript
理解JavaScript原型链
2016/10/25 Javascript
JavaScript实现按键精灵的原理分析
2017/02/21 Javascript
jquery easyui dataGrid动态改变排序字段名的方法
2017/03/02 Javascript
JavaScript队列的应用实例详解【经典数据结构】
2017/04/12 Javascript
JavaScript实现修改伪类样式
2017/11/27 Javascript
JavaScript树的深度优先遍历和广度优先遍历算法示例
2018/07/30 Javascript
微信小程序通过websocket实时语音识别的实现代码
2020/08/19 Javascript
[45:59]EG vs OG 2018国际邀请赛小组赛BO2 第二场 8.17
2018/08/18 DOTA
python实现监控linux性能及进程消耗性能的方法
2014/07/25 Python
Python格式化压缩后的JS文件的方法
2015/03/05 Python
Python的Urllib库的基本使用教程
2015/04/30 Python
Python文本特征抽取与向量化算法学习
2017/12/22 Python
Python之ReportLab绘制条形码和二维码的实例
2018/01/15 Python
Window10+Python3.5安装opencv的教程推荐
2018/04/02 Python
python3.x 将byte转成字符串的方法
2018/07/17 Python
Django框架的中的setting.py文件说明详解
2018/10/15 Python
Django配置文件代码说明
2019/12/04 Python
CSS3中伪元素::before和::after的用法示例
2017/09/18 HTML / CSS
手对手的教你用canvas画一个简单的海报的方法示例
2018/12/10 HTML / CSS
本科毕业自我鉴定
2014/03/20 职场文书
解决golang在import自己的包报错的问题
2021/04/29 Golang
vue使用echarts实现折线图
2022/03/21 Vue.js