#include<stdio.h> #include<string.h> #include<math.h> int dp[100],visit[100]; int n; int prime(int x) { int i; for(i=2;i<=sqrt(x);i++) if(x%i==0) return 0; return 1; } void DFS(int x) { int i,j; if( (x==n)&&prime(dp[x]+dp[1])&&prime(dp[x]+dp[x-1]) ) { for(i=1;i<=n;i++) printf(i==1?"%d":" %d",dp[i]); puts(""); } else { for(i=2;i<=n;i++) if(prime(dp[x]+i)&&!visit[i]) { visit[i]=1; dp[x+1]=i; DFS(x+1); visit[i]=0; } } } int main( ) { int l=1; while(scanf("%d",&n)!=EOF) { if(n==1) { printf("Case %d:\n\n",l++); continue; } else printf("Case %d:\n",l++); memset(visit,0,sizeof(visit)); memset(dp,0,sizeof(dp)); dp[1]=1; DFS(1); puts(""); } return 0; }
这题的主要思路是如何判断在dfs结束。。。就是把值保存在数组里面。数组标号从1开始,至n结束。