JS算法之八皇后问题(回溯法)
八皇后这个经典的算法网上有很多种思路,我学习了之后自己实现了一下,现在大概说说我的思路给大家参考一下,也算记录一下,以免以后自己忘了要重新想一遍。
八皇后问题
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
工作原理
首先从定义知道,两个皇后都不能处于同一行,所以第0个皇后放在第0行,第一个皇后放在第1行,以此类推。
先在第0行第0个格子(0,0)放一个皇后0,接着把处于同一行、同一列或同一斜线上的格子都标记为皇后0;
然后把皇后1放到第1行标记为-1的格子中,以此类推直到放下皇后7(即最后一个皇后)。
若中途出现放皇后 iQueen时,第 iQueen行所有格子已经被全部标记,即if( arr[ iQueen*n + i ].index == -1 )的判断,则回溯到上一层函数(其实就是没有进入到if分支,所有没有进行递归了,代码执行完自然会跳回上一层函数继续执行)。
注意此时的执行环境(exection context)已经变了,所有setQueen函数内定义的变量全部回溯到上一层函数递归到下一层函数前的状态,即执行setQueen( iQueen + 1 );这行代码前的状态,例如递归前i=2,iQueen=1,无论下一层函数里的i和iQueen怎样变化,回溯后还是i=2,iQueen=1,然后紧接着执行未执行完的代码。
下面是执行顺序大概的图解:

执行顺序:1.if-->1.1-->1.2-->1.递归-->2.if-->2.1-->2.2-->2.递归-->3.if-->2.回溯-->1.回溯(前面的标号表示第几层)
var n = 8;//总行(列)数 8*8
var iCount = 0;//n皇后的解法数
//arr是长度为n*n的一维数组,保存着n*n个对象(li)并有各自的坐标,默认index都为-1,表示没有被任何皇后标记过 arr[ i*n + j ].y = i; arr[ i*n + j ].x = j;
for(var i=0;i<n;i++){
for(var j=0;j<n;j++){
arr[ i*n + j ].x = j;
arr[ i*n + j ].y = i;
//arr[ i*n + j ].innerHTML = j + ',' + i;
}
}
//iQueen从0开始,即皇后0
function setQueen(iQueen){
if( iQueen == n ){
iCount++;
console.log(iCount)
return;
}
for(var i=0;i<n;i++){
if( arr[ iQueen*n + i ].index == -1 ){
arr[ iQueen*n + i ].index = iQueen;
//arr[ iQueen*n + i ].innerHTML = iQueen;
var x = arr[ iQueen*n + i ].x;
var y = arr[ iQueen*n + i ].y;
for(var j=0;j<arr.length;j++){
if( arr[j].index == -1 && (arr[j].x == x || arr[j].y == y || arr[j].x - arr[j].y == x - y || arr[j].x + arr[j].y == x + y) ){
arr[j].index = iQueen;
//arr[j].innerHTML = iQueen;
}
}
//执行到这里,就会跳到下一层函数中,在执行完下一层的函数后,才会回溯到上一层继续执行for循环(此时的for循环是上一层的for循环),包括后面的所有代码
//需要注意的是,例如当前函数的iQueen=1,跳到下一层函数 iQueen=2,下一层函数执行完后,回溯到上一层,此时的执行环境已经是上一层的执行环境了,即iQueen是等于1,而不是等于2
//递归
setQueen( iQueen + 1 );
//回溯
for(var j=0;j<arr.length;j++){
if( arr[j].index == iQueen ){
arr[j].index = -1;
//arr[j].innerHTML = -1;
}
}
}
}
}
JS算法之八皇后问题(回溯法)的更多相关文章
- noj算法 8皇后打印 回溯法
描述: 输出8皇后问题所有结果. 输入: 没有输入. 输出: 每个结果第一行是No n:的形式,n表示输出的是第几个结果:下面8行,每行8个字符,‘A’表示皇后,‘.’表示空格.不同的结果中,先输出第 ...
- 八皇后问题-回溯法(MATLAB)
原创文章,转载请注明:八皇后问题-回溯法(MATLAB) By Lucio.Yang 1.问题描述 八皇后问题是十九世纪著名数学家高斯于1850年提出的.问题是:在8*8的棋盘上摆放8个皇后,使其不能 ...
- 算法入门经典-第七章 例题7-4-1 拓展 n皇后问题 回溯法
实际上回溯法有暴力破解的意思在里面,解决一个问题,一路走到底,路无法通,返回寻找另 一条路. 回溯法可以解决很多的问题,如:N皇后问题和迷宫问题. 一.概念 回溯算法实际类似枚举的搜索尝试过程,主 ...
- 『嗨威说』算法设计与分析 - 回溯法思想小结(USACO-cha1-sec1.5 Checker Challenge 八皇后升级版)
本文索引目录: 一.回溯算法的基本思想以及个人理解 二.“子集和”问题的解空间结构和约束函数 三.一道经典回溯法题点拨升华回溯法思想 四.结对编程情况 一.回溯算法的基本思想以及个人理解: 1.1 基 ...
- HDU 2553 n皇后问题(回溯法)
DFS Time Limit:1000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u Description ...
- N皇后问题--回溯法
1.引子 中国有一句古话,叫做“不撞南墙不回头",生动的说明了一个人的固执,有点贬义,但是在软件编程中,这种思路确是一种解决问题最简单的算法,它通过一种类似于蛮干的思路,一步一步地往前走,每 ...
- JAVA实现N皇后问题(回溯法)
package com.leetCode; /** * Follow up for N-Queens problem. Now, instead outputting board configurat ...
- N皇后问题 回溯法 C/C++
一:问题描述 N皇后问题(含八皇后问题的拓展,规则同四皇后):在N*N的棋盘上,放置N个皇后,要求每一横行每一列,每一对角线上均只能放置一个皇后,求解可能的方案及方案数. 二:代码及结果如下 #inc ...
- 8皇后-----回溯法C++编程练习
/* * 八皇后问题回溯法编程练习 * 在8×8的棋盘上,放置8个皇后,两个皇后之间不能两两攻击 * 也即,直线,垂直45度.135度方向不能出现两个皇后 * * copyright Michael ...
随机推荐
- 构造函数详解,explicit,初始化列表
一.构造函数 在类中有一种特殊的成员函数,它的名字与类名相同,我们在创建类的时候,这个特殊的成员函数就会被系统调用.这个成员函数,就叫“构造函数”. 因为构造函数会被系统自动调动,构造函数的目的就是初 ...
- Vue-cli 2.9 多页配置及多页面之间的跳转问题
vue开发,现在大部分做的都是(SPA)应用,但是,由于,需求不同,我们针对的用户需求变更较为,频繁,如果每次都全量打包更新,给开发的自测,及测试妹子的任务就会多,每次都要重新验证一下才放心.所以,想 ...
- CSS01--概述与选择器
CSS:Cascading Style Sheets,层叠样式表.我们之前已经说过,HTML解决的是网页内容(结构)的问题,而CSS立足于网页的表现方面的问题,则样式定义如何显示HTML标签,js负责 ...
- Webpack学习错误解决笔记
错误1:在用npm install 安装模块时,时常会出现没有以下类似的错误 解决方法:右键点击node_modules文件夹,选取属性,将文件夹只读选项去除 错误2:在学习到清理/dist文件夹这块 ...
- Java8内存结构—永久代(PermGen)和元空间(Metaspace)
本文转载 作者:liuxiaopeng 博客地址:https://www.cnblogs.com/paddix/p/5309550.html 一.JVM 内存结构 根据 JVM 规范,JVM 内存共分 ...
- Android Studio 学习笔记1.1 创建自己的第一个安卓项目并且打包APK
自从上一次安装完安卓开发工具Android Studio后抽时间看视屏尝试编写自己的第一个安卓项目约两周的时间 每天下班后会花上1~2小时的时间去学习 目前的成果如下:次元宅的我.apk 嘛 总而 ...
- 本地docker镜像上传Docker Hub,并且在腾讯云上pull该镜像,最后运行成功。
1:在docker hub 上注册一个账号(本人直接能注册,有的说不能),然后创建自己的仓库. 2:登录docker hub ( longdbdocker --hub账号,longdb --仓库名称) ...
- php 使用 rabbitmq
1,配置好rabbitmq 服务器 (参照 http://www.cnblogs.com/spicy/p/7017603.html)(我是linux) 2,新增了一个用户 并点击该用户 增加权限如下
- orcale 之pl/sql例外
orcale 中的例外我们可以看作是其他编程语言中的异常,是为了增强语言的健壮性和容错性. 在orcale中常见的有以下几种: No_data_found 很容易理解就是没有数据返回. Too_man ...
- PHP之string之str_shuffle()函数使用
str_shuffle (PHP 4 >= 4.3.0, PHP 5, PHP 7) str_shuffle - Randomly shuffles a string str_shuffle - ...