题意:
给你个n,要你输出可以形成几个素数环,素数环就是两两相加为素数的环,并且第一个数为1.
题解:
用DFS去跑,判断一下两个数是否为素数。注意的是,在最后一个两两相加为素数的时候还要判断一下最后一个数和1的和是否为素数。
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
int a[25];
bool vis[25];
int n;
int prime(int x)
{
int j=sqrt(x),i;
for(i=2;i<=j;i++)
if(x%i==0)
return 1;
if(i>j)
return 0;
}
void dfs(int x,int l)
{
if(l>n)
{
if(prime(x+1))
return ;
for(int i=1;i<n;i++)
printf("%d ",a[i]);
printf("%d\n",a[n]);
// for(int i=1;i<=n;i++)
// printf("vis=%d %d\n",i,vis[i]);
return ;
}
for(int i=2;i<=n;i++)
{
if(vis[i])
continue;
if(prime(i+x))
continue;
// printf("%d\n",i+x);
vis[i]=true;
a[l]=i;
dfs(i,l+1);
vis[i]=false;
}
return ;
}
int main()
{
int k=1;
while(~scanf("%d",&n))
{
memset(vis,false,sizeof(vis));
memset(a,0,sizeof(a));
printf("Case %d:\n",k++);
a[1]=1;
dfs(1,2);
printf("\n");
}
}