以1为开头建立一个素数环,要求环相邻的两位加起来是一个素数,输入一个数字,将1到这个数字的所有数字放在一起构成一个素数环,打表打出所有情况。
好吧,一排数字,然后还要打表,明显遍历然后就是写个DFS= =1015刚写完一个DFS,连着写俩感觉还真是不太想写了......好吧,还是写的不熟练,写一个DFS得写很长时间才能写出来(所以才不想写啊= =),不过该写的还是要写的......
所以......额,DFS所有的情况,成立就输出呗,其中如果输入的数字是奇数的话就不用进DFS了,因为奇数的话表示会有两个奇数相加,肯定得不到一个素数,这样只输出个Case就好了~然后偶数再遍历。注意一下格式,每次输出Case完之后都要输出一个空行(包括最后一组数据)。表示当时写完DFS觉得大功告成,然后就华丽的把格式的问题忘了......然后就是PE了╮(╯_╰)╭
下面是AC的代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int a[25];
bool vis[25],pri[45];
int n;
int prime()
{
int i,j;
for(i=2;i<40;i++)
{
if(!pri[i])
{
for(j=i+i;j<40;j=j+i)
{
pri[j]=1;//不是素数的标为1
}
}
}
return 0;
}
int dfs(int step)
{
int i;
if(step<1||step>n)
return 0;
if(step==n&&!pri[1+a[n]])
{
for(i=1;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<a[n]<<endl;
return 0;
}
for(i=2;i<=n;i++)
{
if(!vis[i]&&!pri[i+a[step]])
{
a[step+1]=i;
vis[i]=1;
dfs(step+1);
vis[i]=0;
}
}
return 0;
}
int main()
{
int i;
int k=0;
memset(vis,0,sizeof(vis));
prime();
while(scanf("%d",&n)!=EOF)
{
k++;
if(n==1)
{
cout<<"Case "<<k<<":"<<endl<<1<<endl<<endl;
continue;
}
if(n%2==1)
{
cout<<"Case "<<k<<":"<<endl<<endl;
continue;
}
for(i=1;i<=n;i++)
{
a[i]=i;
}
cout<<"Case "<<k<<":"<<endl;
dfs(1);
cout<<endl;
}
return 0;
}