- 1、本文档共10页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
回溯法解决素数环
算法分析实验报告
回溯法-素数环
学生姓名:
专 业:计算机科学与技术
班 级:
学 号:
指导教师:
2017年6月12日
目录
一、实验题目 2
二、实验目的 2
三、实验要求 2
四、实现过程 3
1、实验设计: 3
2、调试分析: 7
3、运行结果: 8
4、实验总结: 8
五、参考文献 9
一、实验题目
回溯法-素数环
二、实验目的
1.掌握回溯法的设计思想。
2.了解和掌握各种经典问题的回溯思想。
三、实验要求
1.[问题描述]:
把整数{1、2、3、····、20}填写到一个环中,要求每个整数只能填写一次,并且相邻的两个整数之和是一个素数。
2.[算法]:
回溯法: 在包含问题的所有可能解的解空间树中,从根节点出发,按照深度优先遍历的策略进行搜索,对于解空间树种的某个节点,如果该节点满足问题的约束条件,则进入该子树继续进行搜索,否则将以该节点为根节点的子树进行剪枝。回溯法常常可以避免所有的可能解,所以,适用于求解组合数中较大的问题。
回溯法从解空间树的根节点出发,按照深度优先遍历策略搜索满足约束条件的解。在搜索至树种某节点时,先判断该节点对应的部分是否满足约束条件,也就是判断该节点是否包含问题的(最优)解,如果肯定不包含,则跳过该节点为跟的子树,即所谓剪枝;否则,进入以该节点为跟的子树,继续按照深度优先遍历策略进行搜索。
四、实现过程
1、实验设计:
1. 这个素数环有20 个位置,每个位置可以填写的整数位1~20,共20种可能,可以对每个位置从1开始进行探索,约束条件是正在试探的数满足如下约束条件:
与已经填写的素数环中的整数不重复;
与前面相邻的整数之和是一个素数;
最后一个填写到素数环中的整数与第一个填写的整数之和是一个素数。
在填写第K个位置时,如果满足上述约束条件,则继续填写第K+1个位置;如果1~20都无法填写到第K个位置,则取消对第K个位置的填写,回溯到第K+1个位置。
2.图解过程
以下以{1、2、3、4}为例进行图解分析:
由上图可知有两种结果:{1、2、3、4}
{1、4、3、2}
3.算法实现
int Prime(int x)//判断整数x是否素数
{
int i,n;
n=(int)sqrt(x);
for(i=2;in;i++)
if(x%i==0) return 0;
return 1;
}
int check(int k)
{
int flag=0,n;
for(int i=0;ik;i++)
{
if(a[i]==a[k])//判断是否重复
return 0;
}
flag=Prime(a[k]+a[k-1]);
if(flag==1k==n-1)//判断第一个和最后一个是否素数
flag=Prime(a[k]+a[0]);
return flag;
}
void primecircle(int n)
{
int i,k;
for(i=0;in;i++)
{
a[i]=0;//将数组a[]初始化为0
}
a[0]=1;k=1;//指定第0个位置填1
while(k=1)
{
a[k]=a[k]+1;
while(a[k]=n)
{
if(check(k)==1)//位置k可以填写数a[]
break;
else
a[k]=a[k]+1;//试探下一个数
}
if(a[k]=n k==n-1)//求解完毕输出解
{
for(i=0;in;i++)
{
couta[i] endl;
}
return;
}
if(a[k]=n kn-1)//填写下一个位置
k=k+1;
else
a[k--]=0;//回溯
}
2、调试分析—n共n个整数,由于每个位置可以填写的情况有n种,因此,素数环问题的解空间数是一棵完全n叉树,且树的深度为n+1,因此,最坏情况下的时间性能为O(n ?)。
3、运行结果:
4、实验总结:
通过本次实验加深了我对回溯算法所给的模式的理解,同时对用回溯算法解决一个实际问题有了一个更深层次的认识。回溯算法非递归的模式通用,用它解决一个问题的关键是找出合法解与部分解的判断条件,在合法解时书写相应程序段,在部分解时书写相应程序段。另外注意有些条件部分解和合法解都要满足,此时要排除掉非法解,即要给它剪去。另外需要注意的是回溯的过程。总之,通过本次实验使我掌握了回溯算法非递归的一般模式,以后在解决一类问题时可以照着这个模式
文档评论(0)