如果用全排列生成之后,在判断是否是素数环是会超时的,应该用回溯。
回溯的时候 首先要注意 递归边界 ,结束的时候别忘记判断最后一个和第一个元素能否成立
还有要记得vis的使用和递归之后的清理。
#include <cstdio> #include <cstring> using namespace std; ; +],vis [+]; +]; void dfs(int cur) { ]+a[]]) { printf(]); ;i<n;i++) printf(" %d",a[i]); printf("\n"); return ; } ;i<=n;i++) { && isprime[ a[cur-]+i ] ) { vis[i]=;a[cur]=i; dfs(cur+); vis[i]=; } } } int main() { ;i<=;i++) isprime[i]=true; isprime[]=isprime[]=false; ;i<=;i++) { if(isprime[i]) { ;j+=i) { isprime[j]=false; } } } ; while(~scanf("%d",&n)) { if(flag) printf("\n"); flag=; printf("Case %d:\n",++p); memset(vis,,sizeof(vis)); a[]=;vis[]=; dfs(); } ; }