回朔法

来源:互联网 发布:五金行业进销存软件 编辑:程序博客网 时间:2024/05/21 20:24

回朔法定义:

是一种选优搜索法,又称为试探法,按选优条件向前搜索,以达到目标。但当探索到某一步时,发现原先选择并不优或达不到目标,就退回一步重新选择,这种走不通就退回再走的技术为回溯法,而满足回溯条件的某个状态的点称为“回溯点”。


时间性能:

回朔法实际属于蛮力穷举法,在最坏的情况下,时间代价肯定为指数阶


素数环问题:

// 0515.cpp : Defines the entry point for the console application.//#include "stdafx.h"#include <iostream>#include <math.h>using namespace std;int Prim(int x){int i,n;n=(int)sqrt(x);for(i=2; i<=n; i++)if(x%i==0)return 0;return 1;}//Prim函数用来判断这个数是不是一个素数int Check(int n,int k,int a[]){int flag=0;for(int i=0; i<k; i++)if(a[i]==a[k])return 0;flag=Prim(a[k]+a[k-1]);if(flag==1 && k==n-1)flag=Prim(a[k]+a[0]);return flag;}//Check函数用来判断a[k]是否适合放在a[k-1]后面以及最后一个数字是否适合void PrimCircle(int n,int a[]){int i,k;for(i=0; i<n; i++)a[i]=0;a[0]=1;k=1;while(k>=1){a[k]=a[k]+1;while(a[k]<=n)if(Check(n,k,a)==1)break;elsea[k]=a[k]+1;if(a[k]<=n && k==n-1){for(i=0; i<n; i++)cout<<a[i]<<" ";return;}if(a[k]<=n && k<n-1)k=k+1;elsea[k--]=0;}}//回朔法 一个一个判断 不适合就掉头回去重新算 int main(){int a[100];int n;cout<<"请输入素数环的个数:";cin>>n;PrimCircle(n,a);cout<<endl;}

最坏情况时间复杂度为O(n的n次方)




原创粉丝点击