八皇后问题:将八个皇后摆在一张8*8的国际象棋棋盘上,使每个皇后都无法吃掉别的皇后,一共有多少种摆法?

两个皇后不能同时在同一行,同一列,和斜对角线的位置上,使用回溯法解决。

从第一行选个位置开始放棋子,第二行从0开始选择满足规则的位置,到第三行发现没有位置可以满足规则,那么就把第二行的棋子向后移动一个可以满足规则的位置,如果没有这个位置,就返回到第一行,将棋子向后移动一个,从头开始,以此类推。

这个同学的博客讲的很通俗易懂 https://www.cnblogs.com/bigmoyan/p/4521683.html

1、首先尝试使用嵌套for循环实现,发现只能找出第一种解法,没办法统计到所有的解法

  1. var n = 8    
      var arr = [];

      var total = ;
  2. function b() {
  3. for (var row = ; row <= n;) {
  4. if (row == n) {
  5. total++;
  6. break;
  7. } else {
  8. var col = ;
  9. if (arr[row] != undefined) {
           //说明是回溯回来重新选择位置的,要从上次的位置开始往后选
  10. var col = arr[row] + ;
  11. }
  12. for (; col <= n; col++) {
  13. if (col == n) {
            //当前行的所有列都走完了,都没有位置可以放棋子,则从上一行开始从新选择位置
  14. arr[row] = undefined;
  15. row--;
  16. if (row)
  17. break;
  18. }
  19. if (isOk(row, col)) {
  20. arr[row] = col;
  21. row++;
  22. break;
  23. }
  24. }
  25. }
  26. }
  27. }
  28. function isOk(row, col) {
  29. for (var i = ; i < row; i++) {
  30. if (row == ) {
    //第一行随便放哪个位置都行
  31. return true;
  32. }
  33. if (arr[i] == col || Math.abs(arr[i] - col) == Math.abs(i - row)) {
         //同一行,同一列或者斜对角线都不能放
  34. return false;
  35. }
  36. }
  37. return true;
  38. }
  39. b();
  40. console.info(total);

for循环太复杂了,当找到一个解法后,希望移动第一行的棋子,寻找其他解法时,这个时候,当回溯到第一行时,无法控制棋子的位置(比如已经从第0个位置移到2位置才寻找到了第一种解法,当寻找其他解法时,回溯到第一行时,就不应该在返回都0,1这个两个位置),for循环无法记录。

转用递归实现,此时每一行的for循环都能被记住当前是第几列

  1. var arr = [];
  2. var total = ;
  3. var arr2=[];
  4.  
  5. function ab(row){
  6. if(row == n){
  7. //当row已经成功走到最后一行,说明已经找到了一种解法
  8. arr2.push([].slice.call(arr));//找到一种解法,就把当前的位置记录下来
  9. total++;
  10. }
  11. for(var col=;col<n;col++){
  12. if(isOk(row,col)){
  13. //当前行的这一列不与前几行的位置冲突,则把这个位置记录下来,位置记录下来,是为了每次循环比较是否有冲突
  14. arr[row]=col;
  15. ab(row+);//进入下一行选位置,因为递归,所以当里层的循环全部结束以后,会返回上一层继续循环,实现了回溯
  16. }
  17. }
  18. }
  19. function isOk(row, col) {
  20. for (var i = ; i < row; i++) {
  21. //从第0行开始比较和当前的位置是否有冲突
  22. if (row == ) {
  23. return true;
  24. }
  25. if (arr[i] == col || Math.abs(arr[i] - col) == Math.abs(i - row)) {
  26. return false;
  27. }
  28. }
  29. //成功比较完了之前的所有行,说明这个位置可以放置
  30. return true;
  31. }
  32. ab();
  33. console.info(total);
  34. console.info(arr2);

js实现八皇后,回溯法的更多相关文章

  1. 8皇后-----回溯法C++编程练习

    /* * 八皇后问题回溯法编程练习 * 在8×8的棋盘上,放置8个皇后,两个皇后之间不能两两攻击 * 也即,直线,垂直45度.135度方向不能出现两个皇后 * * copyright Michael ...

  2. [poj百练]2754:八皇后 回溯

    描述 会下国际象棋的人都很清楚:皇后可以在横.竖.斜线上不限步数地吃掉其他棋子.如何将8个皇后放在棋盘上(有8 * 8个方格),使它们谁也不能被吃掉!这就是著名的八皇后问题. 对于某个满足要求的8皇后 ...

  3. 八皇后问题-回溯法(MATLAB)

    原创文章,转载请注明:八皇后问题-回溯法(MATLAB) By Lucio.Yang 1.问题描述 八皇后问题是十九世纪著名数学家高斯于1850年提出的.问题是:在8*8的棋盘上摆放8个皇后,使其不能 ...

  4. 算法——八皇后问题(eight queen puzzle)之回溯法求解

    八皇后谜题是经典的一个问题,其解法一共有种! 其定义: 首先定义一个8*8的棋盘 我们有八个皇后在手里,目的是把八个都放在棋盘中 位于皇后的水平和垂直方向的棋格不能有其他皇后 位于皇后的斜对角线上的棋 ...

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

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

  6. USACO 1.5.4 Checker Challenge跳棋的挑战(回溯法求解N皇后问题+八皇后问题说明)

    Description 检查一个如下的6 x 6的跳棋棋盘,有六个棋子被放置在棋盘上,使得每行,每列,每条对角线(包括两条主对角线的所有对角线)上都至多有一个棋子. 列号 0 1 2 3 4 5 6 ...

  7. javascript实现数据结构: 树和二叉树的应用--最优二叉树(赫夫曼树),回溯法与树的遍历--求集合幂集及八皇后问题

    赫夫曼树及其应用 赫夫曼(Huffman)树又称最优树,是一类带权路径长度最短的树,有着广泛的应用. 最优二叉树(Huffman树) 1 基本概念 ① 结点路径:从树中一个结点到另一个结点的之间的分支 ...

  8. 『嗨威说』算法设计与分析 - 回溯法思想小结(USACO-cha1-sec1.5 Checker Challenge 八皇后升级版)

    本文索引目录: 一.回溯算法的基本思想以及个人理解 二.“子集和”问题的解空间结构和约束函数 三.一道经典回溯法题点拨升华回溯法思想 四.结对编程情况 一.回溯算法的基本思想以及个人理解: 1.1 基 ...

  9. 八皇后問題 (C語言递归實現 回溯法)

    八皇后问题是一个以国际象棋为背景的问题:怎样可以在 8×8 的国际象棋棋盘上放置八个皇后,使得不论什么一个皇后都无法直接吃掉其它的皇后?为了达到此目的.任两个皇后都不能处于同一条横行.纵行或斜线上.現 ...

随机推荐

  1. map集合的常用方法

    package test; import java.util.Collection; import java.util.HashMap; import java.util.Map; import ja ...

  2. C# 登陆验证码工具类VerifyCode

    using System; using System.Collections.Generic; using System.Drawing; using System.Drawing.Imaging; ...

  3. 初学python之路-day10

    基础部分先告一段落,今天开始学习函数. 一.函数:完成 特定 功能的代码块,作为一个整体,对其进行特定的命名,该名字就代表函数         -- 现实中:很多问题要通过一些工具进行处理 => ...

  4. TLS1.3&TLS1.2形式化分析

    本博客是对下面博客连接上的原文进行梳理+自己在其他方面资料做个整理 https://blog.csdn.net/andylau00j/article/details/79269499 https:// ...

  5. win10遇见的问题

    所有问题的终极解决办法:系统重置 1.Windows PowerShell打不开,重装.net framework装不上 电脑系统为win10企业版,今天第n遍安装sql server 2017的时候 ...

  6. 论文阅读笔记四十八: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 摘要 大规模的目标检测数据集在 ...

  7. ubuntu快速部署gitlab汉化容器

    前言:gitlab的原理我就不扯了(看这个https://www.jianshu.com/p/567207ac51cd),下面直接上操作 1.前提: a.要有docker的运行环境,用service ...

  8. .Net Core 技巧

    避免同步调用 正确的使用异步编程 async/await 使用异步编程尽量避免 Task.Await() 或者 Task.Result(因为会阻塞线程,直到任务完成,有违异步的设计思想) 尽量始终执行 ...

  9. CocosCreator检测动作执行完毕的方法~之一吧,应该= =

    解决方案是利用动作序列,在动作后面跟一个回调函数,然后再利用之前设置好的动作执行完毕标志,即可完成动作结束的判断!Bingo!

  10. fastdfsDemo

    package com.xpl.fastdfs; import org.csource.common.NameValuePair;import org.csource.fastdfs.*;import ...