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中的load方法装载IE缓存中文件的方法
Sep 11 Javascript
jquer之ajaxQueue简单实现代码
Sep 15 Javascript
50个比较实用jQuery代码段
Sep 18 Javascript
ajax中get和post的说明及使用与区别
Dec 23 Javascript
了不起的node.js读书笔记之node的学习总结
Dec 22 Javascript
JavaScript中对象的不同创建方法
Aug 12 Javascript
jQuery的时间datetime控件在AngularJs中的使用实例(分享)
Aug 17 jQuery
浅谈Vuex的状态管理(全家桶)
Nov 04 Javascript
React Native 图片查看组件的方法
Mar 01 Javascript
详解webpack2异步加载套路
Sep 14 Javascript
layui问题之自动滚动二级iframe页面到指定位置的方法
Sep 18 Javascript
浅谈TypeScript 索引签名的理解
Oct 16 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获取当前网址url并替换参数或网址的方法
2010/06/06 PHP
PHP通用检测函数集合
2011/02/08 PHP
针对PHP开发安全问题的相关总结
2019/03/22 PHP
PHP大文件切割上传功能实例分析
2019/07/01 PHP
javascript 页面划词搜索JS
2009/09/28 Javascript
JS代码放在head和body中的区别分析
2011/12/01 Javascript
js实现点击向下展开的下拉菜单效果代码
2015/09/01 Javascript
基于javascript实现动态显示当前系统时间
2016/01/28 Javascript
js实现界面向原生界面发消息并跳转功能
2016/11/22 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
2016/12/05 Javascript
AngularJS入门教程之路由机制ngRoute实例分析
2016/12/13 Javascript
微信小程序实战之顶部导航栏(选项卡)(1)
2020/06/19 Javascript
在node环境下parse Smarty模板的使用示例代码
2019/11/15 Javascript
Python列表生成器的循环技巧分享
2015/03/06 Python
Python WXPY实现微信监控报警功能的代码
2017/10/20 Python
pycharm重置设置,恢复默认设置的方法
2018/10/22 Python
pyqt5 实现多窗口跳转的方法
2019/06/19 Python
python写程序统计词频的方法
2019/07/29 Python
Python3 虚拟开发环境搭建过程(图文详解)
2020/01/06 Python
使用PyTorch实现MNIST手写体识别代码
2020/01/18 Python
python 装饰器的使用示例
2020/10/10 Python
CSS3 选择器 基本选择器介绍
2012/01/21 HTML / CSS
加拿大最大的钻石商店:Peoples Jewellers
2018/01/01 全球购物
Tessabit美国:集世界奢侈品和设计师品牌的意大利精品买手店
2020/06/29 全球购物
请用Java实现列出某个目录下的所有文件
2013/09/23 面试题
咨询公司各岗位职责
2013/12/02 职场文书
旅游管理专业生自荐信范文
2014/01/02 职场文书
电子信息专业应届生自荐信
2014/06/04 职场文书
党的群众路线教育实践活动剖析材料
2014/09/30 职场文书
审计局2014法制宣传日活动总结
2014/11/01 职场文书
2014年出纳工作总结与计划
2014/12/09 职场文书
python基础详解之if循环语句
2021/04/24 Python
详解CSS不定宽溢出文本适配滚动
2021/05/24 HTML / CSS
关于antd tree 和父子组件之间的传值问题(react 总结)
2021/06/02 Javascript
如何用python清洗文件中的数据
2021/06/18 Python
搭建zabbix监控以及邮件报警的超级详细教学
2022/07/15 Servers