HDU_1016,惠普g41016tx
#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;}