回溯搜索的非递归思路及实例源码.doc

  1. 1、本文档共9页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
回溯搜索的非递归思路及实例源码

回溯搜索的非递归思路及实例源码 摘要:本文简要描述了回溯算法的基本思路,并给出了几个典型实例的源码 关键字:回溯,搜索,非递归,全排列,组合,N皇后,整数划分,0/1背包 回溯是按照某种条件在解空间中往前试探搜索,若前进中遭到失败,则回过头来另择通路继续搜索。 符号声明: 解空间:[a1,a2,a3,...,an]; x[k]为解空间元素的索引, 0 <= x[k] < n;k为数组x的索引; a[x[0~n-1]]表示一组解。 //判断解空间中的a[x[k]]是否满足条件 bool CanbeUsed(int k) {? if(x[k] 不满足条件) return false; ? else return true; } 算法描述如下: k = 0; x[k] = -1; while( k >= 0 ) ??? x[k] = x[k] + 1; ??? while(x[k] < n && ( ! CanbeUsed(k) ))//遍历解空间,直到找到可用的元素 ????????? x[k] = x[k] + 1; ??? if(x[k] > n -1)//x[k]超出了解空间a的索引范围 ????????? k = k - 1; //回溯 ??? else if( k == n -1)//找到了n - 1个元素 ????????? 输出一组解 ??? else???? //当前元素可用,更新变量准备寻找下一个元素 ????????? k = k + 1;?? ???? ???? x[k] = -1; } } 回溯的这种实现方式非常适合于在解空间中搜索特定长度的序列! 实例源码: 1.回溯之全排列(VC6.0/VS2005)============================================== //////////////////////////////// //回溯搜索之全排列 #include<iostream> #include<string> using namespace std; #define N 100 string str; int x[N]; bool IsPlaced(int n) { for(int i = 0; i < n ; ++i) {?? if(x[i] == x[n]) ??? return false; } return true; } void PrintResult() { for(int i = 0; i < str.length(); ++i) ? ? cout<<str[x[i]]; cout<<endl; } void Arrange() { int k = 0; x[k] = -1; while(k >= 0) { x[k] = x[k] + 1; ?? while(x[k] < str.length() && !IsPlaced(k)) ?? {??? x[k] = x[k] + 1; ?? } if(x[k] > str.length() - 1) ?? {??? k = k - 1; ?? } ?? else if( k == str.length() - 1) ?? {??? PrintResult(); ?? } ?? else ?? {??? k = k + 1; ??? x[k] = -1; ?? } ?? } } int main() { cout<<"input:"<<endl; while(cin>>str) {?? cout<<str<<" arrange......"<<endl; ?? Arrange(); ?? cout<<"input:"<<endl; } return 0; } 2.八皇后(N皇后)========================================================= //////////////////////////////////////// //回溯之N皇后问题[ 4<=N<=100] #include <iostream> using namespace std; #define N 8 //用于防置皇后的棋盘 //0表示未放置,1表示已放置 int board[N][N]={ 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0 };

文档评论(0)

haihang2017 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档