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的parseInt 进制问题
May 07 Javascript
js 禁用只读文本框获得焦点时的退格键
Apr 25 Javascript
10个基于浏览器的JavaScript调试工具分享
Feb 07 Javascript
javascript 上下banner替换具体实现
Nov 14 Javascript
javascript为下拉列表动态添加数据项
May 23 Javascript
JavaScript 学习笔记之基础中的基础
Jan 13 Javascript
最新最热最实用的15个jQuery插件汇总
Jul 05 Javascript
javascript稀疏数组(sparse array)和密集数组用法分析
Dec 28 Javascript
Node.js 基础教程之全局对象
Aug 06 Javascript
详解JS构造函数中this和return
Sep 16 Javascript
vue swipe自定义组件实现轮播效果
Jul 03 Javascript
js实现自定义滚动条的示例
Oct 27 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
Blitz templates 最快的PHP模板引擎
2010/04/06 PHP
thinkPHP5.0框架事务处理操作简单示例
2018/09/07 PHP
JS中style属性
2006/10/11 Javascript
js获取时间(本周、本季度、本月..)
2013/11/22 Javascript
JS实现支持Ajax验证的表单插件
2016/03/24 Javascript
基于JS实现无缝滚动思路及代码分享
2016/06/07 Javascript
JS对HTML表格进行增删改操作
2016/08/22 Javascript
JS中常用的正则表达式
2016/09/29 Javascript
AngularJS用户选择器指令实例分析
2016/11/04 Javascript
JavaScript对象封装的简单实现方法(3种方法)
2017/01/03 Javascript
NodeJs使用Mysql模块实现事务处理实例
2017/05/31 NodeJs
Vue.js2.0中的变化小结
2017/10/24 Javascript
JS实现快递单打印功能【推荐】
2018/06/21 Javascript
如何在微信小程序里面退出小程序的方法
2019/04/28 Javascript
简单了解TypeScript中如何继承 Error 类
2019/06/21 Javascript
JS call()及apply()方法使用实例汇总
2020/07/11 Javascript
vue单元格多列合并的实现
2020/11/26 Vue.js
Python中文编码那些事
2014/06/25 Python
Python编码爬坑指南(必看)
2016/06/10 Python
Python原始字符串与Unicode字符串操作符用法实例分析
2017/07/22 Python
python移位运算的实现
2019/07/15 Python
纯CSS3打造动感漂亮时尚的扇形菜单
2014/03/18 HTML / CSS
北美领先的牛仔品牌:Buffalo David Bitton
2017/05/22 全球购物
Speedo澳大利亚官网:全球领先游泳品牌
2018/02/04 全球购物
Stio官网:男女、儿童户外服装
2019/12/13 全球购物
描述内存分配方式以及它们的区别
2016/10/15 面试题
软件测试面试题
2015/10/21 面试题
园林设计专业毕业生求职信
2014/03/23 职场文书
篮球比赛策划方案
2014/06/05 职场文书
租房协议书范文
2014/08/20 职场文书
环境卫生倡议书
2014/08/29 职场文书
学习实践科学发展观心得体会
2014/09/10 职场文书
大学生推广普通话演讲稿
2014/09/21 职场文书
2015年初一班主任工作总结
2015/05/13 职场文书
高中诗歌鉴赏教学反思
2016/02/16 职场文书
python如何为list实现find方法
2022/05/30 Python