嘿嘿,终于还是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; }