八皇后问题,是一个古老而著名的问题,该问题最早由国际西洋棋棋手马克斯·贝瑟尔(Max Bezzel)于1848年提出。八皇后问题的具体描述为:在\(8\times8\)的国际象棋上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。

  八皇后问题,是回溯算法的典型案例。本次分享讲使用递归法来寻找八皇后问题的所有解,并用JavaScript语言来写,同时学习JavaScript中OOP方面的知识。

  八皇后问题的完整代码如下:

<html>
<body> <script>
//create a class
function eightQueen(arr, cnt) {
//parameters
this.arr = arr;
this.cnt = cnt; //methods
this.search = function(r){
//if r == 8, then a solution is found
if(r==8){
document.write('<br>'+this.cnt+'<br>');
this.output(this.arr);
this.cnt++;
return null
}
for(var i=0;i<8;i++){
this.arr[r] = i;
flag = 1
for(var j=0;j<r;j++){
//check if this position is valid
if(this.arr[r] == this.arr[j] || r-j == Math.abs(this.arr[r]-this.arr[j])){
flag = 0;
break;
}
}
// if flag == 1, then the row numbered r is valid
if(flag) this.search(r+1); //search the next row
}
}
//output the valid solutions in format
this.output = function() {
for(var i=0; i<8;i++){
for(var j=0; j<8;j++){
pos = (j==arr[i]) ? '1 ' : '0 ';
document.write(pos);
}
document.write('<br>');
}
}
} //Initial array
var arr = [-1,-1,-1,-1,-1,-1,-1,-1]
//create a object
var eq = new eightQueen(arr,1);
//use object's method to find all solutions and print them
eq.search(0); </script> </body>
</html>

在上述JavaScript代码中,首先定义了一个类(Class):eightQueen,它的参数为:arr,cnt,其中arr为初始化数组,而cnt可以对方法计数。在eightQueen定义了方法search(),参数为r(第r行),当r等于8时,就找到了一个有效解,同时调用output()函数将这个有效解输出,当找到第r行的有效解后,再去寻找下一行的有效解。利用参数cnt可以帮助我们计数,这样我们就能找到所有有效解的数量。

  该代码在网页中运行的结果如下所示:

![八皇后问题的解(部分)](http://img.blog.csdn.net/20180116094618617?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvamNsaWFuOTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast)

可以看出,所有有效解的数量为92.
  当然,在HTML中可以用更加好的可视化方法来展示,欢迎有兴趣的同学多多尝试~~
  本次分享到此结束,欢迎大家交流~~

JavaScript之八皇后问题(递归)的更多相关文章

  1. YTU 3013: 皇后问题(递归)

    3013: 皇后问题(递归) 时间限制: 1 Sec  内存限制: 128 MB 提交: 2  解决: 2 题目描述 编写一个函数,求解皇后问题:在n*n的方格棋盘上,放置n个皇后,要求每个皇后不同行 ...

  2. java实现八皇后问题(递归和循环两种方式)

    循环方式: package EightQueens;   public class EightQueensNotRecursive { private static final boolean AVA ...

  3. N皇后问题——递归求解

    比较简单,废话不说,上代码: public class NQueen { //比如:position[1]=3,表示第一行的第三列有一个皇后 private int [] position; //总的 ...

  4. 八皇后问题 递归实现 C语言 超详细 思路 基础

    八皇后问题 :假设 將八个皇后放到国际象棋盘上,使其两两之间无法相互攻击.共有几种摆法? 基础知识: 国际象棋里,棋盘为8X8格. 皇后每步可以沿直线.斜线 走任意格. 思路: 1.想把8个皇后放进去 ...

  5. JS算法之八皇后问题(回溯法)

    八皇后这个经典的算法网上有很多种思路,我学习了之后自己实现了一下,现在大概说说我的思路给大家参考一下,也算记录一下,以免以后自己忘了要重新想一遍. 八皇后问题 八皇后问题,是一个古老而著名的问题,是回 ...

  6. 八皇后非递归(仅使用一个数组且可扩展为N皇后问题)

    </pre><pre name="code" class="cpp">/* Theme:八皇后(非递归) Coder:秒针的声音 Tim ...

  7. javascript构造函数深度克隆递归

    <script type="text/javascript"> var obj={ name:'段丛磊', gex:18, sss:['李伟',18], fun:fun ...

  8. #C++初学记录(N皇后#回溯递归)

    <font size=5 face"微软雅黑">N皇后Problem Description <font size=4 face"微软雅黑"& ...

  9. Javascript函数之深入浅出递归思想

    一.递归函数的理解 1.生活中的递归 "递归"在生活中的一个典例就是"问路".如图小哥哥进入电影院后找不到自己的座位,问身边的小姐姐"这是第几排&qu ...

随机推荐

  1. Navicat导入.xls等文件失败

    一.问题 在学习django的models时,使用Navicat premium导入.xls数据的时候会出现导入失败的原因,即使是换成了csv文件也是失败的,原因是数据库的表有外键,而需要设置外键限制 ...

  2. Codeforces 1082C Multi-Subject Competition 前缀和 A

    Codeforces 1082C Multi-Subject Competition https://vjudge.net/problem/CodeForces-1082C 题目: A multi-s ...

  3. HTTP1.1协议-RFC2616-中文版

    转自:http://www.cnblogs.com/k1988/archive/2010/01/12/2165683.html 说明 本文档规定了互联网社区的标准组协议,并需要讨论和建议以便更加完善. ...

  4. ABP框架系列之三十七:(Navigation-导航)

    Every web application has some menu to navigate between pages/screens. ASP.NET Boilerplate provides ...

  5. IntelliJ IDEA使用心得之Maven项目篇(转)

    IntelliJ IDEA使用心得之Maven项目篇   今天和大家分享下,在IDEA中打开Maven项目的方法. 对于新版的IDEA可以直接打开Maven项目,但是对于旧版的IDEA需要使用Mave ...

  6. 2、JavaScript 基础二 (从零学习JavaScript)

     11.强制转换 强制转换主要指使用Number.String和Boolean三个构造函数,手动将各种类型的值,转换成数字.字符串或者布尔值. 1>Number强制转换 参数为原始类型值的转换规 ...

  7. [转]Ubuntu16.04下ralink rt3290驱动安装

    出处:https://askubuntu.com/questions/253632/how-do-i-get-a-ralink-rt3290-wireless-card-working 解决为问题:L ...

  8. openresty 安装

    1.安装环境.版本说明: 操作系统: Centos 6.5 X86_64 openresty 版本: openresty-1.13.6.1.tar.gz 2.安装 openresty(nginx) 需 ...

  9. 经典qq表情插件(html+nodejs应用)

    由于目前在接触聊天室项目,接到一个需求实现一个类似QQ表情.在网上找了一款jquery经典表情插件.下面介绍一个用法: HTML: 首先在html页面的head中引入jQuery库文件和QQ表情插件j ...

  10. 【2019北京集训六】路径(path) 二分+DP

    此题niubi! 题目大意:给你一颗n个点的点带权无根树,现在请您进行以下两步操作: 1,选择一个$[0,T]$之间的整数$C$,并令所有的点权$wi$变为$(wi+C)%MOD$ 2,选择若干条点不 ...