初步接触了一下回溯法,自己写了一个小程序,但不知道对错 题目:输入一个整数n,输出所有的解,使得从1到n,形成一个环,相邻的两个数之和是素数。 #include <iostream> #include <math.h> using namespace std; int n; int a[100]={0}; int check1(int t)//检查和之前的元素是否重复 { for (int i=1;i<=t-1;i++) { if(a[i]==a[t]) return 0;//如果重复返回0 } return 1;//不重复返回1 } int check2(int x,int y) { int s=a[x]+a[y]; int n=sqrt((float)s); for(int i=2;i<=n;i++) if(s%i==0) return 0;//如果不是素数返回1; return 1; } int check3(int t) { if(t<n) return check2(t,t-1)&&check1(t); else return check2(t,t-1)&&check2(t,1)&&check1(t); } int main() { cin>>n; a[1]=0; int k=1; while (k>0)//当回溯还没有到根节点 { a[k]=a[k]+1; while (a[k]<=n&&check3(k)!=1)//一要在解空间之内,二要满足约束条件 a[k]=a[k]+1; if (a[k]<=n) { if (k==n)//当达到问题解规模时输出 { for (int x=1;x<=n;x++) cout<<a[x]<<" "; cout<<endl; } else { k=k+1;//扩展当前节点 a[k]=0;//扩展节点后,重新从〇开始搜索 } } else k=k-1;//回溯节点 } return 0; }