回溯法的应用
# include<iostream>
# include<cstring>
using namespace std;
const int maxn=100+5;
bool isprim[maxn];
int a[maxn];
int n;
bool vis[maxn];
bool prim(int i)
{
for(int j=2;j<i;j++)
{
if(i%j==0)
return false;
}
return true;
}
void search(int cur)
{
if(cur==n&&isprim[a[0]+a[n-1]])
{
for(int i=0;i<n;i++)
{
cout<<a[i]<<(i!=n-1? " ":"\n");
//条件运算符,控制最后一个输出后不再输出" ",而是输出换行否则也会出现presentation error
}
}
else for(int i=2;i<=n;i++)
{
if(!vis[i]&&isprim[i+a[cur-1]])
{
a[cur]=i;
vis[i]=true;
search(cur+1);
vis[i]=false;
}
}
}
int main()
{
int tot=0;
for(int i=2;i<=100;i++) isprim[i]=prim(i); //初始化素数表
while(scanf("%d",&n)==1)
{
if(tot) // 此处不输出一个换行符,会出现presentation error
cout<<endl;
printf("Case %d:\n",++tot);
memset(vis,0,sizeof(vis));
for(int i=0;i<n;i++) a[i]=i+1; // 第一个序列
search(1);
}
return 0;
}