回溯算法的基本要点
来源:互联网 发布:查看windows序列号 编辑:程序博客网 时间:2024/06/16 00:30
回溯法
回溯法也称为试探法,该方法首先暂时放弃关于问题规模大小的限制,并将问题的候选解按某种顺序逐一枚举和检验。当发现当前候选解不可能是解时,就选择下一个候选解;倘若当前候选解除了还不满足问题规模要求外,满足所有其他要求时,继续扩大当前候选解的规模,并继续试探。如果当前候选解满足包括问题规模在内的所有要求时,该候选解就是问题的一个解。在回溯法中,放弃当前候选解,寻找下一个候选解的过程称为回溯。扩大当前候选解的规模,以继续试探的过程称为向前试探。
【问题】 填字游戏 问题描述:在3×3个方格的方阵中要填入数字1到N(N≥10)内的某9个数字,每个方格填一个整数,似的所有相邻两个方格内的两个整数之和为质数。试求出所有满足这个要求的各种数字填法。
经典回溯算法的解题思路:
文字描述:先填入第一个方格的数值,并在当前数值填入正确的前提下为下一个方格填入合理的数值,依次为接下来的方格填入数值,如果当前数值不合理,则按一定顺序(一般是按从小到大的顺序)修改数值,并且去除所有该解的答案(剪枝,该分支以后的解都不考虑),如果当前方格的所有数值都不符合要求,则回溯到上一方格调整数值,直到9个方格都填入了正确的数值则记录当前解答,再按照顺序调整当前方格的数值(第9方格)求取正确解,如果当前方格的所有解都以遍历则回溯到上一方格调整数值,直到回溯到第一方格并且第一方格的数值不能再调整,则解答完毕。
①填写第1个数值;
②填写第2个数值;
③不满足要求,按照一定顺序修改当前值(一般是从小到大的顺序),且该解的所有结果剔除(剪枝);
④若已经为最大值依然不满足要求,回溯到前一个方格,按顺序修改前一方格的数值;
⑤满足要求,继续填写数值(期间重复3,4步骤的检查);
⑥填写最后一个方格;
⑦满足要求,记录当前解,按顺序修改当前值,并重复3,4步骤的检查;
⑧若回溯到第一方格依然不能修改数值,则遍历完成结束。
【程序】
# include <stdio.h># define N 12void write(int a[ ]){ int i,j; for (i=0;i<3;i++) { for (j=0;j<3;j++) printf(“%3d”,a[3*i+j]); printf(“\n”); } scanf(“%*c”);}int b[N+1];int a[10];int isprime(int m){ int i; int primes[ ]={2,3,5,7,11,17,19,23,29,-1}; if (m==1||m%2=0) return 0; for (i=0;primes[i]>0;i++) if (m==primes[i]) return 1; for (i=3;i*i<=m;) { if (m%i==0) return 0; i+=2; }return 1;}int checkmatrix[ ][3]={ {-1},{0,-1},{1,-1},{0,-1},{1,3,-1},{2,4,-1},{3,-1},{4,6,-1},{5,7,-1}};int selectnum(int start){ int j;for (j=start;j<=N;j++) if (b[j]) return j;return 0;}int check(int pos){ int i,j; if (pos<0) return 0; for (i=0;(j=checkmatrix[pos][i])>=0;i++) if (!isprime(a[pos]+a[j]) return 0;return 1;}int extend(int pos){ a[++pos]=selectnum(1); b[a][pos]]=0; return pos;}int change(int pos){ int j; while (pos>=0&&(j=selectnum(a[pos]+1))==0) b[a[pos--]]=1; if (pos<0) return –1; b[a[pos]]=1; a[pos]=j; b[j]=0; return pos;}void find(){ int ok=0,pos=0; a[pos]=1; b[a[pos]]=0; do { if (ok) if (pos==8) { write(a); pos=change(pos); } else pos=extend(pos); else pos=change(pos); ok=check(pos); } while (pos>=0)}void main(){ int i; for (i=1;i<=N;i++) b[i]=1; find();}
回溯算法的基本框架
如果一个程序要找全部解,则在将找到的解输出后,应继续调整最后位置上填放的整数,试图去找下一个解,相应的算法如下:
{ int m=0,ok=1; int n=8; do{ if (ok) { if (m==n) { 输出解; 调整; } else 扩展; } else 调整; ok=检查前m个整数填放的合理性; }while (m!=0);}
- 回溯算法的基本要点
- LCD12864的基本要点
- 回溯算法的形式
- 回溯算法的使用
- 回溯算法的理解
- 9种基本算法_回溯
- 回溯算法:基本思想以及方法
- 基本算法——第六单元 回溯
- 回溯法的基本思想
- 回溯法的基本框架
- Java的abstract基本要点
- Java的接口基本要点
- sqoop的基本应用要点
- HBase的基本配置要点
- 关于AIDL的基本要点
- N皇后的回溯算法
- “皇后”问题的回溯算法
- 图着色的回溯算法
- 平方等式问题
- ajax请求错误status=0(Provisional headers are shown)
- Python wordcloud之中文词云
- 图片即时优化的三种简单解决方案
- Git 上传和下传
- 回溯算法的基本要点
- 欢迎使用CSDN-markdown编辑器
- 前端页面中嵌入ckeditor
- 004_Ajax实现HTML局部更新
- 第一个函数SystemInit()里面有些啥,时钟设置及简介
- maven eclipse搭建web项目并发布到tomcat
- 动态网页
- 模拟退火算法
- 扩展ASCII码字符对应UNICODE编码