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 相关文章推荐
jQuery1.4.2与老版本json格式兼容的解决方法
Feb 12 Javascript
javascript闭包的高级使用方法实例
Jul 04 Javascript
JavaScript动态修改背景颜色的方法
Apr 16 Javascript
浅谈javascript中遇到的字符串对象处理
Nov 18 Javascript
JS 判断某变量是否为某数组中的一个值的3种方法(总结)
Jul 10 Javascript
EL表达式截取字符串的函数说明
Sep 22 Javascript
angularJs提交文本框数据到后台的方法
Oct 08 Javascript
vue-cli+axios实现文件上传下载功能(下载接收后台返回文件流)
May 10 Javascript
微信小程序Echarts覆盖正常组件问题解决
Jul 13 Javascript
JavaScript页面加载事件实例讲解
Sep 01 Javascript
js实现图片实时时钟
Jan 15 Javascript
Vue-cli打包后如何本地查看的操作
Sep 02 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的fsockopen、pfsockopen函数被主机商禁用的解决办法
2014/07/08 PHP
php设计模式之单例模式实例分析
2015/02/25 PHP
PHP使用缓存即时输出内容(output buffering)的方法
2015/08/03 PHP
php获取手机端的号码以及ip地址实例代码
2018/09/12 PHP
PHP后期静态绑定实例浅析
2018/12/21 PHP
JavaScript 闭包深入理解(closure)
2009/05/27 Javascript
jQuery1.6 使用方法一
2011/11/23 Javascript
基于jquery的has()方法以及与find()方法以及filter()方法的区别详解
2013/04/26 Javascript
javascript右下角弹层及自动隐藏(自己编写)
2013/11/20 Javascript
jQuery自定义事件的简单实现代码
2014/01/27 Javascript
js 通过html()及text()方法获取并设置p标签的显示值
2014/05/14 Javascript
javascript实现的简单计时器
2015/07/19 Javascript
基于JavaScript实现手机短信按钮倒计时(超简单)
2015/12/30 Javascript
AngularJS中实现显示或隐藏动画效果的方式总结
2015/12/31 Javascript
jQuery查找节点方法完整实例
2016/09/13 Javascript
Angularjs 实现分页功能及示例代码
2016/09/14 Javascript
Bootstrap select多选下拉框实现代码
2016/12/23 Javascript
jQuery中复合选择器简单用法示例
2018/03/31 jQuery
python网络编程示例(客户端与服务端)
2014/04/24 Python
浅谈Python 字符串格式化输出(format/printf)
2016/07/21 Python
numpy中索引和切片详解
2017/12/15 Python
详解Python中的Lock和Rlock
2021/01/26 Python
美国一家专业的太阳镜网上零售商:Solstice太阳镜
2016/07/25 全球购物
路由表示做什么用的?在linux环境中怎么来配置一条默认路由?
2013/06/07 面试题
周鸿祎:教你写创业计划书
2013/12/30 职场文书
房屋公证委托书
2014/04/03 职场文书
《登鹳雀楼》教学反思
2014/04/09 职场文书
工伤赔偿协议书
2014/04/15 职场文书
五四演讲稿范文
2014/09/03 职场文书
2014年班主任工作总结
2014/11/08 职场文书
总经理助理岗位职责范本
2015/03/31 职场文书
2015年四年级班主任工作总结
2015/10/22 职场文书
2019最新版劳务派遣管理制度
2019/08/16 职场文书
python实现简单倒计时功能
2021/04/21 Python
python中os.path.join()函数实例用法
2021/05/26 Python
详解Oracle数据库中自带的所有表结构(sql代码)
2021/11/20 Oracle