js实现八皇后,回溯法
八皇后问题:将八个皇后摆在一张8*8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇后,一共有多少种摆法?
两个皇后不能同时在同一行,同一列,和斜对角线的位置上,使用回溯法解决。
从第一行选个位置开始放棋子,第二行从0开始选择满足规则的位置,到第三行发现没有位置可以满足规则,那么就把第二行的棋子向后移动一个可以满足规则的位置,如果没有这个位置,就返回到第一行,将棋子向后移动一个,从头开始,以此类推。
这个同学的博客讲的很通俗易懂 https://www.cnblogs.com/bigmoyan/p/4521683.html
1、首先尝试使用嵌套for循环实现,发现只能找出第一种解法,没办法统计到所有的解法
- var n = 8 ;
var arr = [];
var total = ;- function b() {
- for (var row = ; row <= n;) {
- if (row == n) {
- total++;
- break;
- } else {
- var col = ;
- if (arr[row] != undefined) {
//说明是回溯回来重新选择位置的,要从上次的位置开始往后选- var col = arr[row] + ;
- }
- for (; col <= n; col++) {
- if (col == n) {
//当前行的所有列都走完了,都没有位置可以放棋子,则从上一行开始从新选择位置- arr[row] = undefined;
- row--;
- if (row)
- break;
- }
- if (isOk(row, col)) {
- arr[row] = col;
- row++;
- break;
- }
- }
- }
- }
- }
- function isOk(row, col) {
- for (var i = ; i < row; i++) {
- if (row == ) {
//第一行随便放哪个位置都行- return true;
- }
- if (arr[i] == col || Math.abs(arr[i] - col) == Math.abs(i - row)) {
//同一行,同一列或者斜对角线都不能放- return false;
- }
- }
- return true;
- }
- b();
- console.info(total);
for循环太复杂了,当找到一个解法后,希望移动第一行的棋子,寻找其他解法时,这个时候,当回溯到第一行时,无法控制棋子的位置(比如已经从第0个位置移到2位置才寻找到了第一种解法,当寻找其他解法时,回溯到第一行时,就不应该在返回都0,1这个两个位置),for循环无法记录。
转用递归实现,此时每一行的for循环都能被记住当前是第几列
- var arr = [];
- var total = ;
- var arr2=[];
- function ab(row){
- if(row == n){
- //当row已经成功走到最后一行,说明已经找到了一种解法
- arr2.push([].slice.call(arr));//找到一种解法,就把当前的位置记录下来
- total++;
- }
- for(var col=;col<n;col++){
- if(isOk(row,col)){
- //当前行的这一列不与前几行的位置冲突,则把这个位置记录下来,位置记录下来,是为了每次循环比较是否有冲突
- arr[row]=col;
- ab(row+);//进入下一行选位置,因为递归,所以当里层的循环全部结束以后,会返回上一层继续循环,实现了回溯
- }
- }
- }
- function isOk(row, col) {
- for (var i = ; i < row; i++) {
- //从第0行开始比较和当前的位置是否有冲突
- if (row == ) {
- return true;
- }
- if (arr[i] == col || Math.abs(arr[i] - col) == Math.abs(i - row)) {
- return false;
- }
- }
- //成功比较完了之前的所有行,说明这个位置可以放置
- return true;
- }
- ab();
- console.info(total);
- console.info(arr2);
js实现八皇后,回溯法的更多相关文章
- 8皇后-----回溯法C++编程练习
/* * 八皇后问题回溯法编程练习 * 在8×8的棋盘上,放置8个皇后,两个皇后之间不能两两攻击 * 也即,直线,垂直45度.135度方向不能出现两个皇后 * * copyright Michael ...
- [poj百练]2754:八皇后 回溯
描述 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8皇后 ...
- 八皇后问题-回溯法(MATLAB)
原创文章,转载请注明:八皇后问题-回溯法(MATLAB) By Lucio.Yang 1.问题描述 八皇后问题是十九世纪著名数学家高斯于1850年提出的.问题是:在8*8的棋盘上摆放8个皇后,使其不能 ...
- 算法——八皇后问题(eight queen puzzle)之回溯法求解
八皇后谜题是经典的一个问题,其解法一共有种! 其定义: 首先定义一个8*8的棋盘 我们有八个皇后在手里,目的是把八个都放在棋盘中 位于皇后的水平和垂直方向的棋格不能有其他皇后 位于皇后的斜对角线上的棋 ...
- JS算法之八皇后问题(回溯法)
八皇后这个经典的算法网上有很多种思路,我学习了之后自己实现了一下,现在大概说说我的思路给大家参考一下,也算记录一下,以免以后自己忘了要重新想一遍. 八皇后问题 八皇后问题,是一个古老而著名的问题,是回 ...
- USACO 1.5.4 Checker Challenge跳棋的挑战(回溯法求解N皇后问题+八皇后问题说明)
Description 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行,每列,每条对角线(包括两条主对角线的所有对角线)上都至多有一个棋子. 列号 0 1 2 3 4 5 6 ...
- javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题
赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...
- 『嗨威说』算法设计与分析 - 回溯法思想小结(USACO-cha1-sec1.5 Checker Challenge 八皇后升级版)
本文索引目录: 一.回溯算法的基本思想以及个人理解 二.“子集和”问题的解空间结构和约束函数 三.一道经典回溯法题点拨升华回溯法思想 四.结对编程情况 一.回溯算法的基本思想以及个人理解: 1.1 基 ...
- 八皇后問題 (C語言递归實現 回溯法)
八皇后问题是一个以国际象棋为背景的问题:怎样可以在 8×8 的国际象棋棋盘上放置八个皇后,使得不论什么一个皇后都无法直接吃掉其它的皇后?为了达到此目的.任两个皇后都不能处于同一条横行.纵行或斜线上.現 ...
随机推荐
- map集合的常用方法
package test; import java.util.Collection; import java.util.HashMap; import java.util.Map; import ja ...
- C# 登陆验证码工具类VerifyCode
using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; ...
- 初学python之路-day10
基础部分先告一段落,今天开始学习函数. 一.函数:完成 特定 功能的代码块,作为一个整体,对其进行特定的命名,该名字就代表函数 -- 现实中:很多问题要通过一些工具进行处理 => ...
- TLS1.3&TLS1.2形式化分析
本博客是对下面博客连接上的原文进行梳理+自己在其他方面资料做个整理 https://blog.csdn.net/andylau00j/article/details/79269499 https:// ...
- win10遇见的问题
所有问题的终极解决办法:系统重置 1.Windows PowerShell打不开,重装.net framework装不上 电脑系统为win10企业版,今天第n遍安装sql server 2017的时候 ...
- 论文阅读笔记四十八:Bounding Box Regression with Uncertainty for Accurate Object Detection(CVPR2019)
论文原址:https://arxiv.org/pdf/1809.08545.pdf github:https://github.com/yihui-he/KL-Loss 摘要 大规模的目标检测数据集在 ...
- ubuntu快速部署gitlab汉化容器
前言:gitlab的原理我就不扯了(看这个https://www.jianshu.com/p/567207ac51cd),下面直接上操作 1.前提: a.要有docker的运行环境,用service ...
- .Net Core 技巧
避免同步调用 正确的使用异步编程 async/await 使用异步编程尽量避免 Task.Await() 或者 Task.Result(因为会阻塞线程,直到任务完成,有违异步的设计思想) 尽量始终执行 ...
- CocosCreator检测动作执行完毕的方法~之一吧,应该= =
解决方案是利用动作序列,在动作后面跟一个回调函数,然后再利用之前设置好的动作执行完毕标志,即可完成动作结束的判断!Bingo!
- fastdfsDemo
package com.xpl.fastdfs; import org.csource.common.NameValuePair;import org.csource.fastdfs.*;import ...