• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >C语言 > 算法详解之回溯法具体实现

算法详解之回溯法具体实现

作者: 字体:[增加 减小] 来源:互联网 时间:2017-05-28

通过本文主要向大家介绍了回溯法详解,算法导论中有回溯法嘛,回溯法算法思想,回溯算法,回溯算法的基本思想等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com

理论辅助:

回溯算法也叫试探法,它是一种系统地搜索问题的解的方法。回溯算法的基本思想是:从一条路往前走,能进则进,不能进则退回来,换一条路再试。用回溯算法解决问题的一般步骤为:

1、定义一个解空间,它包含问题的解。

2、利用适于搜索的方法组织解空间。

3、利用深度优先法搜索解空间。

4、利用限界函数避免移动到不可能产生解的子空间。

问题的解空间通常是在搜索问题的解的过程中动态产生的,这是回溯算法的一个重要特性。

还是那个基调,不喜欢纯理论的东西,喜欢使用例子来讲诉理论,在算法系列总结:动态规划(解公司外包成本问题) 的那一节里面 我们举得是经典的0-1背包问题,在回溯算法里面也有一些很经典的问题,当然,动态规划的0-1背包问题其实也可以使用回溯算法来解。在诸如此类似的求最优解的问题中,大部分其实都可以用回溯法来解决,可以认为回溯算法一个”通用解题法“,这是由他试探性的行为决定的,就好比求一个最优解,我可能没有很好的概念知道怎么做会更快的求出这个最优解,但是我可以尝试所有的方法,先试探性的尝试每一个组合,看看到底通不通,如果不通,则折回去,由最近的一个节点继续向前尝试其他的组合,如此反复。这样所有解都出来了,在做一下比较,能求不出最优解吗?

例子先行,现在我们来看看经典的N后问题

问题描述:在n*n格的棋盘上放置彼此不受攻击的n个皇后。按照国际象棋的规矩,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。n后问题等价于在n*n格的棋盘上方置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。我们需要求的是可放置的总数。
 

基本思路:   用n元组x[1;n]表示n后问题的解。其中,x[i]表示皇后i放置在棋盘的第i行的第x[i]列。由于不容许将2个皇后放在同一列上,所以解向量中的x[i]互不相同。2个皇后不能放在同一斜线上是问题的隐约束。对于一般的n后问题,这一隐约束条件可以化成显约束的形式。如果将n*n 格的棋盘看做二维方阵,其行号从上到下,列号从左到右依次编号为1,2,...n。从棋盘左上角到右下角的主对角线及其平行线(即斜率为-1的各斜线)上,2个下标值的差(行号-列号)值相等。同理,斜率为+1的每条斜线上,2个下标值的和(行号+列号)值相等。因此,若2个皇后放置的位置分别是(i,j)和(k,l),且 i-j = k -l 或 i+j = k+l,则说明这2个皇后处于同一斜线上。以上2个方程分别等价于i-k = j-l 和 i-k =l-j。由此可知,只要|i-k|=|l-j|成立,就表明2个皇后位于同一条斜线上。

1、从空棋盘起,逐行放置棋子。
2、每在一个布局中放下一个棋子,即推演到一个新的布局。
3、如果当前行上没有可合法放置棋子的位置,则回溯到上一行,重新布放上一行的棋子。
代码:


void Backtrak(int t) 
{ 
   if(t>n) sum++; 
   else 
       for(int i=1; i <= n; i++) 
       { 
            x[t] =i; 
            if(Place(t))Backtrak(t+1); 
       } 
}


int main() 
{ 
    int nn; 
    while(scanf("%d",&nn)!=EOF) 
    { 
    n=nn; 
    sum=0; 
    for(int i=0;i<=n;i++) 
    x[i]=0; 
    Backtrak(1); 
    printf("%d\n",sum); 
} 
}
</div>

这段代码有必要解释一下,Place(int)即尝试看是否可以,如果不可以则回退到t+1层,再尝试其他的组合。

这里也道出了回溯算法的核心思想:但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择

算法实践:

问题描述:在一个n*n的网格里,每个网格可能为“墙壁”(用‘X'表示)和“街道”(用‘.'表示)。现在在街道放置碉堡,每个碉堡可以向上下左右四个方向开火,子弹射程无限远。墙壁可以阻挡子弹。问最多能放置多少个碉堡,使它们彼此不会互相摧毁。

如下面四张图,墙壁用黑正方形表示,街道用空白正方形表示,圆球就代表碉堡。1,2,3是正确的,4,5是错误的。以为4,5里面在某一行或者某一列有两个碉堡,这样他们就会互相攻击了。意思明白了吗?可能我的表达很不清晰,呵呵….

输入输出示例


Sample input:
      ——————输入的n值 
.X.. 
.... 

XX..
.... 

XX 
.X 
.X. 
X.X 
.X. 
.... 
.... 
.... 
....

Sample output:


初拿到这个问题,你会不会想到回溯算法呢?有人说遍历墙的位置,然后再墙的上下左右四个格子放置碉堡会得到最优解,这个我没有验证过,细细的用笔画了画,好像是这么回事,但是很多时候要知道最优解用什么方法是很难发现的,利用通用解题方法回溯法,我们可以在一片茫然的时候开始我们的编程

首先我们来分析一下这个问题:使用回溯法,我们尝试每一种可能放置的情况,然后进行判断是否满足要求,若不满足,尝试放到下一个单元格,如此反复,最终,我们将所有可能放置的情况全部遍历出来了,连所有情况都出来了,难不成还找不到最优解吗?哈哈。。说做就做…

   &

分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 算法详解之回溯法具体实现

相关文章

  • 2017-05-28用C语言程序判断大小端模式
  • 2022-04-30C语言二级指针(指向指针的指针)详解
  • 2017-05-28简单谈谈关于C++中大随机数的问题
  • 2017-05-28简单介绍C++编程中派生类的析构函数
  • 2017-05-28深入理解C++编程中的局部变量和全局变量
  • 2017-05-28深入理解数组指针与指针数组的区别
  • 2017-05-28基于VC中使用ForceInclude来强制包含stdafx.h的解决方法
  • 2017-05-28解析C语言中结构体struct的对齐问题
  • 2017-05-28C语言位运算和sizeof运算符详解
  • 2017-05-28C++中的对象数组详细解析

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • C++中构造函数与析构函数的调用顺序详解
    • C++编程中__if_exists与__if_not_exists语句的用法
    • 关于尝试开发PHP的MYSQL扩展的使用
    • C++线程池的简单实现方法
    • 解析C++中的虚拟函数及其静态类型和动态类型
    • 总结UNIX/LINUX下C++程序计时的方法
    • 对比分析C语言中的gcvt()和ecvt()以及fcvt()函数
    • 利用ace的ACE_Task等类实现线程池的方法详解
    • c语言求阶乘精确值示例
    • C++基于hook iat改变Messagebox实例

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有