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 相关文章推荐
jQuery简单实现QQ空间点赞已经取消点赞
Apr 02 Javascript
浅谈javascript中的闭包
May 13 Javascript
用js实现放大镜的效果的简单实例
May 23 Javascript
Angular实现图片裁剪工具ngImgCrop实践
Aug 17 Javascript
基于 Vue.js 之 iView UI 框架非工程化实践记录(推荐)
Nov 21 Javascript
Vue脚手架的简单使用实例
Jul 10 Javascript
VUE v-for循环中每个item节点动态绑定不同函数的实例
Sep 26 Javascript
详解React之key的使用和实践
Sep 29 Javascript
layui实现数据表格自定义数据项
Oct 26 Javascript
Vue中图片Src使用变量的方法
Oct 30 Javascript
vue实现整屏滚动切换
Jun 29 Javascript
针对Vue路由history模式下Nginx后台配置操作
Oct 22 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
MOTOROLA 摩托罗拉 MODEL 66-XI五灯中波收音机
2021/03/02 无线电
PHP自动更新新闻DIY
2006/10/09 PHP
PHP SplObjectStorage使用实例
2015/05/12 PHP
(currentStyle)javascript为何有时用style得不到已设定的CSS的属性
2007/08/15 Javascript
jQuery 行背景颜色的交替显示(隔行变色)实现代码
2009/12/13 Javascript
javascript for循环设法提高性能
2010/02/24 Javascript
JS判断是否为数字,是否为整数,是否为浮点数的代码
2010/04/24 Javascript
js 函数的副作用分析
2011/08/23 Javascript
javascript:文字不间断向左移动的实例代码
2013/08/08 Javascript
jQuery实现简单的网页换肤效果示例
2016/09/18 Javascript
谈谈JavaScript中浏览器兼容问题的写法小议
2016/12/17 Javascript
Angular将填入表单的数据渲染到表格的方法
2017/09/22 Javascript
Node.js学习之查询字符串解析querystring详解
2017/09/28 Javascript
nodejs判断文件、文件夹是否存在及删除的方法
2017/11/10 NodeJs
JS面向对象的程序设计相关知识小结
2018/05/26 Javascript
创建与框架无关的JavaScript插件
2020/12/01 Javascript
python3设计模式之简单工厂模式
2017/10/17 Python
python调用java的jar包方法
2018/12/15 Python
tensorflow模型文件(ckpt)转pb文件的方法(不知道输出节点名)
2020/04/22 Python
浅谈numpy中函数resize与reshape,ravel与flatten的区别
2020/06/18 Python
OpenCV+python实现实时目标检测功能
2020/06/24 Python
Python模拟键盘输入自动登录TGP
2020/11/27 Python
使用HTML5和CSS3制作一个模态框的示例
2018/03/07 HTML / CSS
新加坡一家在线男士皮具品牌:Faire Leather Co.
2019/12/01 全球购物
DIY蛋糕店的创业计划书范文
2013/12/26 职场文书
安全事故检讨书
2014/01/18 职场文书
渡河少年教学反思
2014/02/12 职场文书
产品质量承诺书
2014/03/27 职场文书
财产公证书
2014/04/10 职场文书
大学社团计划书
2014/05/01 职场文书
记账会计岗位职责
2014/06/16 职场文书
春节超市活动方案
2014/08/14 职场文书
依法行政工作汇报材料
2014/10/28 职场文书
生产现场禁烟通知
2015/04/23 职场文书
python如何正确使用yield
2021/05/21 Python
Java十分钟精通进阶适配器模式
2022/04/06 Java/Android