http://acm.hdu.edu.cn/showproblem.php?pid=1016
素数环,回溯法
/*Accepted 1016 203MS 248K 1111 B C++ Yu*/ #include<stdio.h> #include<string.h> int A[25], p[40], vis[25], n; void isprime() { int i, j; for(i = 2; i < 40; i ++) p[i] = 1; p[1] = 0; for(i = 2; i * i < 40; i ++) { if(p[i]) { for(j = i + i; j < 40; j += i) p[j] = 0; } } } void dfs(int cur) { int i; if(cur == n && p[A[0] + A[n - 1]]) { for(i = 0; i < n - 1; i ++) { printf("%d ", A[i]); } printf("%d\n", A[n - 1]); } else { for(i = 2; i <= n; i ++) { if(!vis[i] && p[A[cur - 1] + i]) { A[cur] = i; vis[i] = 1; dfs(cur + 1); vis[i] = 0; } } } } int main() { int cas = 1; isprime(); while(scanf("%d", &n) == 1) { printf("Case %d:\n", cas ++); memset(vis, 0, sizeof vis); memset(A, 0, sizeof A); A[0] = 1; dfs(1); printf("\n"); } return 0; }