http://acm.hdu.edu.cn/showproblem.php?pid=1016
1 #include <iostream> 2 #include <cstring> 3 #include <cstdio> 4 bool isp[40], vis[20]; //isp[]素数标记数组 5 int n, a[20]; 6 bool is_prime(int n) //n >= 2 7 { 8 bool flag = 1; 9 for (int i = 2; i * i <= n; ++i) 10 if (n % i == 0) 11 { 12 flag = 0; 13 break; 14 } 15 return flag; 16 } 17 void dfs(int cur) //调用dfs(1) 18 { 19 if (cur == n && isp[a[0]+a[n-1]]) //递归边界 20 { 21 for (int i = 0; i < n - 1; ++i) 22 printf("%d ", a[i]); 23 printf("%d\n", a[n-1]); 24 } 25 else 26 { 27 for (int i = 2; i <= n; ++i) //尝试放置剩余的数 28 if (!vis[i] && isp[i+a[cur-1]]) 29 { 30 a[cur] = i; 31 vis[i] = 1; //标记 32 dfs(cur + 1); 33 vis[i] = 0; //清除标记 34 } 35 } 36 } 37 int main() 38 { 39 for (int i = 2; i <= 40; ++i) //生成素数标记 40 isp[i] = is_prime(i); 41 int cnt = 0; 42 while (scanf("%d", &n) != EOF) 43 { 44 ++cnt; 45 memset(vis, 0, sizeof(vis)); 46 for (int i = 0; i < n; ++i) 47 a[i] = i + 1; 48 printf("Case %d:\n", cnt); 49 dfs(1); 50 printf("\n"); 51 } 52 return 0; 53 }