嘿嘿,终于还是AC了,DFS
多开了几个数组,稍微加快了一点点,不然就超时了,原来,一点一点的剪枝,还是有那么一点点用滴,看代码吧
#include<iostream>
#include<queue>
using namespace std;
int prime[]={2,3,5,7,11,13,17,19,23,29,31,37};//相邻俩个数的和顶多就37,所以把其中的所有素数都直接打表了
int a[20],b[20],n;
bool hash1[40];
void init()//哈希表
{
memset(hash1,0,sizeof(hash1));
for(int i=0;i<12;i++)
hash1[prime[i]]=1;
}
void dfs(int t,int cnt)
{
b[cnt]=t;//保存路径
if(cnt==n)
{
if(hash1[t+1])//判断是否为素数
{
for(int j=1;j<n;j++)
cout<<b[j]<<' ';
cout<<t<<endl;
}
else return ;
}
int i=t%2==0?3:2;
for(;i<=n;i+=2)
{
if(a[i]!=1&&hash1[t+i]==1)
{
a[i]=1;
dfs(i,cnt+1);
a[i]=0;
}
}
return ;
}
int main()
{
int flag=0;
init();
while(cin>>n)
{
flag++;
cout<<"Case "<<flag<<":"<<endl;
memset(a,0,sizeof(a));
a[0]=1;
dfs(1,1);
cout<<endl;
}
return 0;
}