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 function、指针及内置对象
Feb 19 Javascript
autoIMG 基于jquery的图片自适应插件代码
Mar 12 Javascript
Jquery异步请求数据实例代码
Dec 28 Javascript
关于jquery ajax 调用带参数的webservice返回XML数据一个小细节
Jul 31 Javascript
js实现倒计时时钟的示例代码
Dec 17 Javascript
JavaScript使用setInterval()函数实现简单轮询操作的方法
Feb 02 Javascript
jQuery 获取屏幕高度、宽度的简单实现案例
May 17 Javascript
JavaScript数据结构链表知识详解
Nov 21 Javascript
微信小程序实现全国机场索引列表
Jan 31 Javascript
vue绑定的点击事件阻止冒泡的实例
Feb 08 Javascript
JS函数动态传递参数的方法分析【基于arguments对象】
Jun 05 Javascript
react中props 的使用及进行限制的方法
Apr 28 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 stristr() 函数(不区分大小写的字符串查找)
2010/06/03 PHP
php利用新浪接口查询ip获取地理位置示例
2014/01/20 PHP
Laravel 验证码认证学习记录小结
2019/12/20 PHP
php并发加锁问题分析与设计代码实例讲解
2021/02/26 PHP
菜鸟javascript基础整理1
2010/12/06 Javascript
基于Jquery 解决Ajax请求的页面 浏览器后退前进功能,页面刷新功能实效问题
2010/12/11 Javascript
JS TextArea字符串长度限制代码集合
2012/10/31 Javascript
禁用JavaScript控制台调试的方法
2014/03/07 Javascript
后台获取ZTREE选中节点的方法
2015/02/12 Javascript
jQuery实现仿QQ在线客服效果的滚动层代码
2015/10/15 Javascript
js实现input密码框提示信息的方法(附html5实现方法)
2016/01/14 Javascript
Angular.js回顾ng-app和ng-model使用技巧
2016/04/26 Javascript
AngularJS  自定义指令详解及实例代码
2016/09/14 Javascript
JS弹出窗口的运用与技巧大全
2016/11/01 Javascript
js实现右键菜单功能
2016/11/28 Javascript
浅析webpack 如何优雅的使用tree-shaking(摇树优化)
2017/08/16 Javascript
使用ajax的post同步执行(实现方法)
2017/12/21 Javascript
详解key在Vue列表渲染时究竟起到了什么作用
2019/04/20 Javascript
vue路由的配置和页面切换详解
2020/09/09 Javascript
[02:44]2014DOTA2 国际邀请赛中国区预选赛 大神红毯秀
2014/05/25 DOTA
[38:21]2018DOTA2亚洲邀请赛3月30日 小组赛A组 LGD VS Newbee
2018/03/31 DOTA
跟老齐学Python之赋值,简单也不简单
2014/09/24 Python
浅谈python中requests模块导入的问题
2018/05/18 Python
处理python中多线程与多进程中的数据共享问题
2019/07/28 Python
Python利用Faiss库实现ANN近邻搜索的方法详解
2020/08/03 Python
python UDF 实现对csv批量md5加密操作
2021/01/01 Python
h5实现获取用户地理定位的实例代码
2017/07/17 HTML / CSS
医学院学生求职简历的自我评价
2013/10/24 职场文书
我的动漫时代的创业计划书范文
2014/01/27 职场文书
股权收购意向书
2014/04/01 职场文书
2014年初级职称工作总结
2014/12/08 职场文书
优秀教师申报材料
2014/12/16 职场文书
幼儿园迎新生欢迎词
2015/09/30 职场文书
祝福语集锦:给妹妹结婚的祝福语
2019/12/18 职场文书
python 统计代码耗时的几种方法分享
2021/04/02 Python
SQL写法--行行比较
2021/08/23 SQL Server