//这道题,自己在没学DFS的时候就在做,只不过那时只是把代码背到而已,根本没理解意思,现在自己再做,发现并不是那么难,一个简单的DFS就做出来了//:当你能力提高了后,你就会发现,以前的难题,现在就是一个水题,希望以此鼓励自己坚持下去,体会AC的快感//
代码:
#include<stdio.h> #include<string.h> #define max 25 int prime[max]; int isprime[max]; int vis[max]; int a[max]; int n; void Init() { int i,j,cnt=0; memset(vis,0,sizeof(vis)); memset(isprime,0,sizeof(isprime)); memset(vis,0,sizeof(vis)); for(i=2;i<max;i++) { if(vis[i]==0) { prime[cnt++]=i; } for(j=0;j<cnt&&i*prime[j]<max;j++) { vis[i*prime[j]]=1; } } for(i=0;i<cnt;i++) { isprime[prime[i]]=1; } } void dfs(int cur) { if(cur==n&&isprime[a[0]+a[n-1]]) { int i; for(i=0;i<n;i++) { if(i==0) { printf("%d",a[i]); } else { printf(" %d",a[i]); } } printf("\n"); } int i; for(i=1;i<=n;i++) { if(!vis[i]&&isprime[i+a[cur-1]]) { vis[i]=1; a[cur]=i; dfs(cur+1); vis[i]=0; } } } int main() { int k=1; Init(); int cnt=1; while(scanf("%d",&n)!=EOF) { memset(vis,0,sizeof(vis)); a[0]=1; vis[1]=1; printf("Case %d:\n",cnt++); dfs(1); printf("\n"); } return 0; }