递归--基于回溯和递归的八皇后问题解法
八皇后问题是在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
递归--基于回溯和递归的八皇后问题解法相关推荐
- 还记得八皇后的解法吗
"还记得八皇后的解法吗?" "上个世纪的事情,不记得了." "-- 现在回忆一下?" "开会,回头说." " ...
- 迷宫(栈、队列、递归3种方法)和八皇后(栈和递归2种方法)的C/C++描述(上)
***迷宫: 栈是只能在一端进行添加元素和删除元素的表,分顺序栈和链式栈.程序里变量命名应该长一些,做到见名知意.提高程序阅读性.本文用栈的方法存储路径中每一步,栈中每个元素是结构体变量,包含每一步的 ...
- 递归经典问题:迷宫以及八皇后
目录 今日良言:花有重开日,人无再少年 一.迷宫问题 1.问题描述 2.思路分析 3.效果展示 4.完整代码 二.八皇后问题 1.问题描述 2.思路分析 3.效果展示 4.完整代码 今日良言:花有重开 ...
- 回溯法在解决八皇后问题中的应用
回溯法:有这样一类题目,它们要求在相对问题的输入规模按照指数速度增长(或者更快)的域中,找出一个具有指定特性的元素.例如:在图顶点的所有排列中求一个哈密顿回路,在背包问题的一个实例中求其中最有价值的物 ...
- 【恋上数据结构】回溯、剪枝(八皇后、n皇后)、LeetCode51.N皇后、LeetCode52.N皇后 II
回溯 回溯(Back Tracking) 提出八皇后问题(Eight Queens) 初步思路一:暴力出奇迹 初步思路二:根据题意减少暴力程度 初步思路三:回溯法(回溯+剪枝) 四皇后 - 回溯法图示 ...
- Las Vegas 与回溯组合法解八皇后问题
八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例.该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8×8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行.同 ...
- 【Java数据结构与算法】第五章 递归、迷宫回溯和八皇后问题
第五章 递归 文章目录 第五章 递归 一.递归 1.概念 2.代码实现 3.递归的规则 二.迷宫回溯 1.要求 2.代码实现 三.八皇后问题 1.介绍 2.思路 3.代码实现 一.递归 1.概念 简单 ...
- 【C++】【学习笔记】【递归与回溯问题详解与例题】排列问题;组合问题;二维平面回溯;flood fill问题;搜索问题(八皇后);
目录 七.递归和回溯 1.回溯 2.回溯应用 - 排列问题 2.回溯应用 - 组合问题 3.回溯应用 - 二维平面 4.回溯应用 - floodfill算法 问题 4.回溯应用 - 搜索问题 - 八皇 ...
- 回溯算法(八皇后问题)
写在前面:博主是一位普普通通的19届双非软工在读生,平时最大的爱好就是听听歌,逛逛B站.博主很喜欢的一句话花开堪折直须折,莫待无花空折枝:博主的理解是头一次为人,就应该做自己想做的事,做自己不后悔的事 ...
最新文章
- golang中的sync.WaitGroup
- 用java画一个网格_用SolidWorks画一个空心挂钩,这种画法稍微有点麻烦
- 介绍ASP.NET控件ID
- [SuperM]Shell编程课堂笔记+PPT总结
- 自己电脑访问跳板机里面的集群中的web ui界面
- [Bzoj4540][Hnoi2016] 序列(莫队 + ST表 + 单调队列)
- 23种设计模式之工厂方法模式
- 查找(洛谷P2249题题解,C++语言描述)
- 用vue语法写html,Vue -- 模板语法
- Spring Security学习总结
- jQuery练手之滑动出现效果
- createdroptargets_拖拽神器React DnD你真的了解了吗?
- linux 安装 vm
- Data URI scheme
- 电脑数据恢复软件推荐10款
- 深度学习实例——Flappy Bird
- 微信表情符号写入案件判决
- 关于linux的filp->private_data解释
- Mouse without Borders 让键盘和鼠标飞起来
- 微信从原版到现在所有界面图片_微信所有的界面都怎么设置背景图片?
热门文章
- php微信分享接口调用,TP5的微信分享接口和JSSDK使用
- 解决打开虚拟机 VMware Workstation 报错无法改变虚拟机的电源状态 Operation inconsistent with current state问题
- 数学--数论--(逆元)扩展欧几里求解+证明
- 深度学习资料汇总(满满的干货)
- 【OpenPose-Windows】error1 OpenPose项目加载失败
- C语言高级编程:extern用法
- 为什么个体户贷款那么难
- 申请表怎么填才能提高信用卡额度?
- 振臂高呼式的写作:谈肖亦农的《毛乌素绿色传奇》
- 推荐几个机器学习算法及应用领域相关的中国大牛: