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 else26 {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 }