如果用全排列生成之后,在判断是否是素数环是会超时的,应该用回溯。
回溯的时候 首先要注意 递归边界 ,结束的时候别忘记判断最后一个和第一个元素能否成立
还有要记得vis的使用和递归之后的清理。
1 #include <cstdio> 2 #include <cstring> 3 using namespace std; 4 int n,p=0; 5 int a[50+10],vis [50+10]; 6 bool isprime[50+10]; 7 void dfs(int cur) 8 { 9 if(cur==n && isprime[a[n-1]+a[0]]) 10 { 11 printf("%d",a[0]); 12 for(int i=1;i<n;i++) 13 printf(" %d",a[i]); 14 printf("\n"); 15 return ; 16 } 17 18 for(int i=2;i<=n;i++) 19 { 20 if(vis[i]==0 && isprime[ a[cur-1]+i ] ) 21 { 22 vis[i]=1;a[cur]=i; 23 dfs(cur+1); 24 vis[i]=0; 25 } 26 } 27 } 28 int main() 29 { 30 for(int i=0;i<=49;i++) isprime[i]=true; 31 isprime[0]=isprime[1]=false; 32 for(int i=2;i<=7;i++) 33 { 34 if(isprime[i]) 35 { 36 for(int j=i*i;j<=49;j+=i) 37 { 38 isprime[j]=false; 39 } 40 } 41 } 42 int flag=0; 43 while(~scanf("%d",&n)) 44 { 45 if(flag) printf("\n"); 46 flag=1; 47 48 printf("Case %d:\n",++p); 49 memset(vis,0,sizeof(vis)); 50 51 a[0]=1;vis[1]=1; 52 dfs(1); 53 54 } 55 return 0; 56 }
时间: 2024-12-20 15:51:21