八皇后问题,是一个古老而著名的问题,该问题最早由国际西洋棋棋手马克斯·贝瑟尔(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. websocket的简单使用

    一 轮询 什么是轮询:设置每一段时间去访问一次服务器,然后服务器返回最新的数据.这样服务器的压力会非常的大,并且还会有延迟.适用于小型程序. 实现:再客户端的页面设置一个定时发送请求的任务,每个这段时 ...

  2. Struts2学习第四天——拦截器及文件上传

    1.概述 Struts2的很多核心功能都是由拦截器完成的. 拦截器很好的实现了AOP的编程思想,在动作的执行之前和结果的返回之后,做拦截处理. 2.struts2的默认拦截器栈 3.自定义拦截器 St ...

  3. Note | 学术论文写作方法和技巧

    目录 1. 论文发表流程 2. 确定科研方向 3. 思考问题和解决问题 4. 审稿 5. 论文写作 5.1. 标题 5.2. 摘要 5.3.介绍 5.4. 相关工作 5.5. 段落 5.6. 方法 5 ...

  4. Vuejs——(13)组件——杂项

    版权声明:出处http://blog.csdn.net/qq20004604   目录(?)[+]   本篇资料来于官方文档: http://cn.vuejs.org/guide/components ...

  5. 第 1 篇 Scrum 冲刺博客

    各个成员在 Alpha 阶段认领的任务 姓名 Alpha 阶段认领的任务 徐婉萍 创建服务器.域名,环境搭建查询界面及页面的设计,查询方法的编写 谭燕 支出.收入添加界面及设计,收入.支出的方法编写, ...

  6. volatile和synchronized

    volatile是变量修饰符,而synchronized则作用于一段代码或方法:看如下三句get代码: int i1;              int geti1() {return i1;} vo ...

  7. Spark中的Phoenix Dynamic Columns

    代码及使用示例:https://github.com/wlu-mstr/spark-phoenix-dynamic phoenix dynamic columns HBase的数据模型是动态的,很多系 ...

  8. PHP中url相关函数

    1,string urlencode(string $str)/string urldecode(string $str) urlencode将中文以及特殊字符转化为16进制,然后在每个字符前面加%: ...

  9. 利用PHP扩展Taint找出网站的潜在安全漏洞实践

    一.背景 笔者从接触计算机后就对网络安全一直比较感兴趣,在做PHP开发后对web安全一直比较关注,2016时无意中发现Taint这个扩展,体验之后发现确实好用:不过当时在查询相关资料时候发现关注此扩展 ...

  10. 使用 Navicate 连接 Oracle9i 数据库

    Navicat Premium 是一个可多重连接的数据库管理工具,它可让你以单一程序同時连接到 MySQL.SQLite.Oracle 及 PostgreSQL 数据库,让管理不同类型的数据库更加方便 ...