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 相关文章推荐
bootstrap-treeview自定义双击事件实现方法
Jan 09 Javascript
深入理解JS中的substr和substring
Apr 26 Javascript
Bootstrap进度条组件知识详解
May 01 Javascript
使用JS实现图片展示瀑布流效果的实例代码
Sep 12 Javascript
AngularJS控制器之间的通信方式详解
Nov 03 Javascript
微信小程序 form组件详解及简单实例
Jan 10 Javascript
jQuery中Chosen三级联动功能实例代码
Mar 07 Javascript
React中的refs的使用教程
Feb 13 Javascript
vue.js 实现输入框动态添加功能
Jun 25 Javascript
vue.js 实现评价五角星组件的实例代码
Aug 13 Javascript
JavaScript实现简单音乐播放器
Apr 17 Javascript
详解基于React.js和Node.js的SSR实现方案
Mar 21 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 服务器配置(使用Apache及IIS两种方法)
2009/06/01 PHP
几道坑人的PHP面试题 试试看看你会不会也中招
2014/08/19 PHP
php读取txt文件并将数据插入到数据库
2016/02/23 PHP
php preg_match的匹配不同国家语言实例
2016/12/29 PHP
Yii支持多域名cors原理的实现
2018/12/05 PHP
php面向对象基础详解【星际争霸游戏案例】
2020/01/23 PHP
JQUBar 基于JQUERY的柱状图插件
2010/11/23 Javascript
父子窗体间传递JSON格式的数据的代码
2010/12/25 Javascript
JS操作Cookies包括(读取添加与删除)
2012/12/26 Javascript
文本框文本自动补全效果示例分享
2014/01/19 Javascript
使用jQuery不判断浏览器高度解决iframe自适应高度问题
2014/12/16 Javascript
实例讲解jquery中mouseleave和mouseout的区别
2016/02/17 Javascript
微信小程序 购物车简单实例
2016/10/24 Javascript
微信小程序 数据封装,参数传值等经验分享
2017/01/09 Javascript
VUE2.0 ElementUI2.0表格el-table自适应高度的实现方法
2018/11/28 Javascript
Angular 2使用路由自定义弹出组件toast操作示例
2019/05/10 Javascript
vue基于better-scroll仿京东分类列表
2020/06/30 Javascript
Python基类函数的重载与调用实例分析
2015/01/12 Python
Python输出汉字字库及将文字转换为图片的方法
2016/06/04 Python
完美解决Python 2.7不能正常使用pip install的问题
2018/06/12 Python
python numpy 常用随机数的产生方法的实现
2019/08/21 Python
Python pandas自定义函数的使用方法示例
2019/11/20 Python
css3实现input输入框颜色渐变发光效果代码
2014/04/02 HTML / CSS
HTMl5的存储方式sessionStorage和localStorage详解
2014/03/18 HTML / CSS
HTML5本地存储localStorage、sessionStorage基本用法、遍历操作、异常处理等
2014/05/08 HTML / CSS
罗德与泰勒百货官网:Lord & Taylor
2016/08/12 全球购物
Hotels.com香港酒店网:你的自由行酒店订房专家
2018/01/22 全球购物
Dr. Martens马汀博士法国官网:马丁靴鼻祖
2020/01/15 全球购物
优秀部门获奖感言
2014/02/14 职场文书
小学二年级评语
2014/04/21 职场文书
2014年人事工作总结范文
2014/11/19 职场文书
2014年少先队工作总结
2014/12/03 职场文书
财务统计员岗位职责
2015/04/14 职场文书
2015年药品销售工作总结范文
2015/05/25 职场文书
二年级作文之动物作文
2019/11/13 职场文书
win11自动弹出虚拟键盘怎么关闭? Win11关闭虚拟键盘的技巧
2023/01/09 数码科技