八皇后问题是在8*8的棋盘上放置8枚皇后,使得棋盘中每个纵向、横向、左上至右下斜向、右上至左下斜向均只有一枚皇后。八皇后的一个可行解如图所示:

             

   

         

             
         

   
 

           
       

     
           

 
     

       

思路

对于八皇后的求解可采用回溯算法,从上至下依次在每一行放置皇后,进行搜索,若在某一行的任意一列放置皇后均不能满足要求,则不再向下搜索,而进行回溯,回溯至有其他列可放置皇后的一行,再向下搜索,直到搜索至最后一行,找到可行解,输出。

此处可用借鉴陈海涛网易博客中的思路,不用二维数组,而采用一维数组进行回溯,参见http://www.cnblogs.com/jiayouwyhit/p/3226757.html。因为1维数组的下标即可表示行或者列,再在一维数组里面赋值,即可代表列或者行。此条件即可至少满足八皇后问题的一个条件:两个皇后不同行或者不同列。省去后文的一个步骤判断。

本人参考网上别人的回溯思路,写的代码如下:(注意,本代码已经在VC6.0下通过实验测试)

//8皇后问题
//基于递归的回溯算法
const int length=8;

int counter=0;

bool Check(int matrix[], int row)//检验是否合理
{
    int i=0;
    for (i=0;i<=row-1;i++)
    {
        if (matrix[i]==matrix[row] || row-i==matrix[row]-matrix[i] ||i-row==matrix[row]-matrix[i])
            return false;
    }
    return true;
}

void EightQueen(int matrix[], int row)
{
    int i=0,j=0;
    for (i=0;i<length;i++)
    {
        matrix[row]=i;
        if (Check(matrix,row) && row<=length-1)//满足要求
        {
            if (row==length-1)
            {
                ++counter;
                printf("Solution %d:\n",counter);
                for (j=0;j<length;j++)
                    printf("%4d",matrix[j]);
                printf("\n");
            }
            else
                  EightQueen(matrix,row+1);
        }
    }
}

int main(int argc, char* argv[])
{
    int matrix[length]={0};
    EightQueen(matrix,0);

printf("We have solved the problem!\n");
    return 0;
}

复杂度分析:本文算法的时间复杂度为O[n^(n+1)]。比http://www.cnblogs.com/jiayouwyhit/p/3226757.html时间复杂度更高.

实际上,经过实际的实验测试,本文的算法实际上在时间上要比前面提到的算法性能要好很多。经过仔细分析,其原因在于:本文算法中对递归有一个限制条件

Check(matrix,row),即:当当前点不满足我们的约束条件时,直接就不再进行递归,因此函数void EightQueen(int matrix[], int row) 的时间复杂度会远远小于O[n^n](假如不考虑check函数自身的时间复杂度的话)。但该算法具体的时间复杂度是多少,由于有判断语句的存在,本人觉得此处无法写出具体的复杂度表达式(再一次说明本人数学功底还有待提高啊\(^o^)/~)。

转载于:https://www.cnblogs.com/jiayouwyhit/p/3227314.html

递归--基于回溯和递归的八皇后问题解法相关推荐

  1. 还记得八皇后的解法吗

    "还记得八皇后的解法吗?" "上个世纪的事情,不记得了." "-- 现在回忆一下?" "开会,回头说." " ...

  2. 迷宫(栈、队列、递归3种方法)和八皇后(栈和递归2种方法)的C/C++描述(上)

    ***迷宫: 栈是只能在一端进行添加元素和删除元素的表,分顺序栈和链式栈.程序里变量命名应该长一些,做到见名知意.提高程序阅读性.本文用栈的方法存储路径中每一步,栈中每个元素是结构体变量,包含每一步的 ...

  3. 递归经典问题:迷宫以及八皇后

    目录 今日良言:花有重开日,人无再少年 一.迷宫问题 1.问题描述 2.思路分析 3.效果展示 4.完整代码 二.八皇后问题 1.问题描述 2.思路分析 3.效果展示 4.完整代码 今日良言:花有重开 ...

  4. 回溯法在解决八皇后问题中的应用

    回溯法:有这样一类题目,它们要求在相对问题的输入规模按照指数速度增长(或者更快)的域中,找出一个具有指定特性的元素.例如:在图顶点的所有排列中求一个哈密顿回路,在背包问题的一个实例中求其中最有价值的物 ...

  5. 【恋上数据结构】回溯、剪枝(八皇后、n皇后)、LeetCode51.N皇后、LeetCode52.N皇后 II

    回溯 回溯(Back Tracking) 提出八皇后问题(Eight Queens) 初步思路一:暴力出奇迹 初步思路二:根据题意减少暴力程度 初步思路三:回溯法(回溯+剪枝) 四皇后 - 回溯法图示 ...

  6. Las Vegas 与回溯组合法解八皇后问题

    八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同 ...

  7. 【Java数据结构与算法】第五章 递归、迷宫回溯和八皇后问题

    第五章 递归 文章目录 第五章 递归 一.递归 1.概念 2.代码实现 3.递归的规则 二.迷宫回溯 1.要求 2.代码实现 三.八皇后问题 1.介绍 2.思路 3.代码实现 一.递归 1.概念 简单 ...

  8. 【C++】【学习笔记】【递归与回溯问题详解与例题】排列问题;组合问题;二维平面回溯;flood fill问题;搜索问题(八皇后);

    目录 七.递归和回溯 1.回溯 2.回溯应用 - 排列问题 2.回溯应用 - 组合问题 3.回溯应用 - 二维平面 4.回溯应用 - floodfill算法 问题 4.回溯应用 - 搜索问题 - 八皇 ...

  9. 回溯算法(八皇后问题)

    写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...

最新文章

  1. golang中的sync.WaitGroup
  2. 用java画一个网格_用SolidWorks画一个空心挂钩,这种画法稍微有点麻烦
  3. 介绍ASP.NET控件ID
  4. [SuperM]Shell编程课堂笔记+PPT总结
  5. 自己电脑访问跳板机里面的集群中的web ui界面
  6. [Bzoj4540][Hnoi2016] 序列(莫队 + ST表 + 单调队列)
  7. 23种设计模式之工厂方法模式
  8. 查找(洛谷P2249题题解,C++语言描述)
  9. 用vue语法写html,Vue -- 模板语法
  10. Spring Security学习总结
  11. jQuery练手之滑动出现效果
  12. createdroptargets_拖拽神器React DnD你真的了解了吗?
  13. linux 安装 vm
  14. Data URI scheme
  15. 电脑数据恢复软件推荐10款
  16. 深度学习实例——Flappy Bird
  17. 微信表情符号写入案件判决
  18. 关于linux的filp->private_data解释
  19. Mouse without Borders 让键盘和鼠标飞起来
  20. 微信从原版到现在所有界面图片_微信所有的界面都怎么设置背景图片?

热门文章

  1. php微信分享接口调用,TP5的微信分享接口和JSSDK使用
  2. 解决打开虚拟机 VMware Workstation 报错无法改变虚拟机的电源状态 Operation inconsistent with current state问题
  3. 数学--数论--(逆元)扩展欧几里求解+证明
  4. 深度学习资料汇总(满满的干货)
  5. 【OpenPose-Windows】error1 OpenPose项目加载失败
  6. C语言高级编程:extern用法
  7. 为什么个体户贷款那么难
  8. 申请表怎么填才能提高信用卡额度?
  9. 振臂高呼式的写作:谈肖亦农的《毛乌素绿色传奇》
  10. 推荐几个机器学习算法及应用领域相关的中国大牛: