题意很简单不多说。
这是道dfs的题目,比较简单,特别注意,最后一个数跟第一个数的和也要是素数。
下面是代码:
#include<iostream>
#include<cstring>
#include<cmath>
using namespace std;
int a[25];
int vis[25];
int b[25];
int n;
bool is_prime(int m)
{
int k=sqrt(m*1.0);
int i;
if(m==1)
return false;
for(i=2; i<=k; i++)
if(m%i==0)
break;
if(i>k)
return true;
return false;
}
void dfs(int num)
{
if(num==n)
{
if(is_prime(b[n-1]+1))
{
cout<<b[0];
for(int i=1; i<n; i++)
cout<<' '<<b[i];
cout<<endl;
}
return;
}
for(int i=2; i<=n; i++)
{
if(!vis[i]&&is_prime(a[i]+b[num-1]))
{
vis[i]=1;
b[num]=a[i];
dfs(num+1);
vis[i]=0;
}
}
// return false;
}
int main()
{
int loop=0;
while(cin>>n)
{
cout<<"Case "<<++loop<<":"<<endl;
b[0]=1;
memset(vis,0,sizeof(vis));
for(int i=1; i<=n; i++)
a[i]=i;
dfs(1);
cout<<endl;
}
return 0;
}