标签:hdu_1016
#include<cstdio> #include<cmath> #include<iostream> #include<cstring> using namespace std; const int Max = 40; bool prime[Max]; bool vis[Max]; int A[Max]; int n; void IsPrime() { prime[0] = prime[1] = 0; prime[2] = 1; for(int i = 3; i < Max; i++) prime[i] = (i%2 == 0) ? 0 : 1; int t = (int)sqrt(Max*10); for(int i = 3; i <= t; i++) if(prime[i]) for(int j = i*i; j < Max; j += 2*i) prime[j] = 0; } void dfs(int cur) { if(cur == n && prime[A[0]+A[n-1]]) { for(int i = 0; i < n; i++) //打印的时候是从A[0]开始打印的 {printf("%d", A[i]);if(i != n-1) printf(" ");} printf("\n"); } else for(int i = 2; i <= n; i++) if(!vis[i] && prime[i+A[cur-1]]) { // 如果这个数还没有使用过并且和前一个数之和为素数的话 A[cur] = i; vis[i] = 1; dfs(cur+1); vis[i] = 0; //清除标志 } } int main(){ int cnt = 0; IsPrime(); while(scanf("%d", &n) != EOF) { memset(vis, 0, sizeof(vis)); printf("Case %d:\n", ++cnt); A[0] = 1; dfs(1); printf("\n"); } return 0; }
标签:hdu_1016
原文地址:http://blog.csdn.net/czkct/article/details/45649443