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 相关文章推荐
为Extjs加加速(javascript加速)
Aug 19 Javascript
jquery load()在firefox(火狐)下显示不正常的解决方法
Apr 05 Javascript
Fastest way to build an HTML string(拼装html字符串的最快方法)
Aug 20 Javascript
js中return false(阻止)的用法
Aug 14 Javascript
js 判断图片是否加载完以及实现图片的预下载
Aug 14 Javascript
javascript基于prototype实现类似OOP继承的方法
Dec 16 Javascript
JS中split()用法(将字符串按指定符号分割成数组)
Oct 24 Javascript
javascript入门之string对象【新手必看】
Nov 22 Javascript
IE8兼容Jquery.validate.js的问题
Dec 01 Javascript
在点击div中的p时,如何阻止事件冒泡
Feb 07 Javascript
nest.js 使用express需要提供多个静态目录的操作方法
Oct 24 Javascript
Vue 路由间跳转和新开窗口的方式(query、params)
Dec 25 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类中Static方法效率测试代码
2010/10/17 PHP
PHP函数microtime()用法与说明
2013/12/04 PHP
PHP获取当前所在目录位置的方法
2014/11/26 PHP
PHP 在数组中搜索给定的简单实例 array_search 函数
2016/06/13 PHP
PHP性能分析工具xhprof的安装使用与注意事项
2017/12/19 PHP
基于jquery的direction图片渐变动画效果
2010/05/24 Javascript
设为首页和收藏的Javascript代码(亲测兼容IE,Firefox,chrome等浏览器)
2013/11/18 Javascript
javascript实现的简单的表单验证
2015/07/10 Javascript
jQuery 3.0十大新特性
2016/07/06 Javascript
jQuery可见性过滤选择器用法示例
2016/09/09 Javascript
可输入文字查找ajax下拉框控件 ComBox的实现方法
2016/10/25 Javascript
jquery网页日历显示控件calendar3.1使用详解
2016/11/24 Javascript
vue实现动态数据绑定
2017/04/28 Javascript
Nodejs处理异常操作示例
2018/12/25 NodeJs
Node.js 实现简单的无侵入式缓存框架的方法
2019/07/21 Javascript
koa2 从入门到精通(小结)
2019/07/23 Javascript
[02:20]2014DOTA2西雅图邀请赛 MVP外卡赛首胜采访
2014/07/09 DOTA
使用Python装饰器在Django框架下去除冗余代码的教程
2015/04/16 Python
详解Django通用视图中的函数包装
2015/07/21 Python
mac安装scrapy并创建项目的实例讲解
2018/06/13 Python
Python中logging实例讲解
2019/01/17 Python
浅谈Python中eval的强大与危害
2019/03/13 Python
Python multiprocess pool模块报错pickling error问题解决方法分析
2019/03/20 Python
超实用的 30 段 Python 案例
2019/10/10 Python
如何使用python实现模拟鼠标点击
2020/01/06 Python
Python HTTP下载文件并显示下载进度条功能的实现
2020/04/02 Python
python模块如何查看
2020/06/16 Python
html5 canvas-1.canvas介绍(hello canvas)
2013/01/07 HTML / CSS
中国综合网上购物商城:苏宁易购
2016/08/09 全球购物
英国建筑用品在线:Building Supplies Online(BSO)
2018/04/30 全球购物
电子狗项圈:eDog Australia
2019/12/04 全球购物
不用游标的SQL语句有哪些
2012/09/07 面试题
甜美蛋糕店创业计划书
2014/01/30 职场文书
老龙头导游词
2015/02/11 职场文书
解析Java异步之call future
2021/06/14 Java/Android
基于Pygame实现简单的贪吃蛇游戏
2021/12/06 Python