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 基础问答三
Dec 03 Javascript
extJs 下拉框联动实现代码
Apr 09 Javascript
网页图片延时加载的js代码
Apr 22 Javascript
详解JavaScript中的4种类型识别方法
Sep 14 Javascript
JavaScript DOM 学习总结(五)
Nov 24 Javascript
jQuery实现的简单分页示例
Jun 01 Javascript
基于Three.js插件制作360度全景图
Nov 29 Javascript
jQuery File Upload文件上传插件使用详解
Dec 06 Javascript
使用 Node.js 实现图片的动态裁切及算法实例代码详解
Sep 29 Javascript
谈谈React中的Render Props模式
Dec 06 Javascript
微信小程序+云开发实现欢迎登录注册
May 24 Javascript
vue iview的菜单组件Mune 点击不高亮的解决方案
Nov 01 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开发过程中常用函数收藏
2009/12/14 PHP
php实现把数组按指定的个数分隔
2014/02/17 PHP
PHP中的Streams详细介绍
2014/11/12 PHP
php实现的xml操作类
2016/01/15 PHP
php代码架构的八点注意事项
2016/01/25 PHP
CI框架实现优化文件上传及多文件上传的方法
2017/01/04 PHP
jQuery 表格插件整理
2010/04/27 Javascript
Javascript 面向对象(三)接口代码
2012/05/23 Javascript
JavaScript子窗口ModalDialog中操作父窗口对像
2012/12/11 Javascript
jQuery不间断滚动效果(模拟百度新闻支持文字/图片/垂直滚动)
2013/02/05 Javascript
JavaScript自动设置IFrame高度的小例子
2013/06/08 Javascript
a标签的href与onclick事件的区别详解
2014/11/12 Javascript
JavaScript学习笔记之JS对象
2015/01/22 Javascript
javascript经典特效分享 手风琴、轮播图、图片滑动
2016/09/14 Javascript
angularJS之$http:与服务器交互示例
2017/03/17 Javascript
JavaScript实现自动跳转文本功能
2017/05/25 Javascript
深入理解Angular.JS中的Scope继承
2017/06/04 Javascript
javascript 取小数点后几位几种方法总结
2017/08/02 Javascript
Vee-Validate的使用方法详解
2017/09/22 Javascript
详解使用webpack打包编写一个vue-toast插件
2017/11/08 Javascript
微信小程序防止多次点击跳转(函数节流)
2019/09/19 Javascript
JS实现网站楼层导航效果代码实例
2020/06/16 Javascript
Python实现导出数据生成excel报表的方法示例
2017/07/12 Python
Python实现基本数据结构中栈的操作示例
2017/12/04 Python
PyQt5 QSerialPort子线程操作的实现
2018/04/21 Python
浅谈PyTorch中in-place operation的含义
2020/06/27 Python
Python 使用生成器代替线程的方法
2020/08/04 Python
XMLHttpRequest对象在IE和Firefox中创建方式有没有不同
2016/03/23 面试题
高中班长自我鉴定
2013/12/20 职场文书
高中军训感言800字
2014/03/05 职场文书
工地宣传标语
2014/06/18 职场文书
党的群众路线教育实践活动个人对照检查材料(教师)
2014/11/04 职场文书
教师岗位职责范本
2015/04/02 职场文书
2019年学校消防安全责任书(2篇)
2019/10/09 职场文书
mysql 如何获取两个集合的交集/差集/并集
2021/06/08 MySQL
Python selenium绕过webdriver监测执行javascript
2022/04/12 Python