题目链接。
分析:
先求出素数表。再DFS。
#include <stdio.h> #include <string.h> #define MAXN 21 int isp[MAXN+MAXN], num[MAXN], n, vis[MAXN], cnt; void prime(){ int i, j; memset(isp, -1, sizeof(isp)); isp[0] = isp[1] = 0; for(i=2; i<=MAXN+MAXN; i++){ if(isp[i]) for(j=i*i; j<=MAXN+MAXN; j += i) isp[j] = 0; } } void dfs(int cur){ int i; if(cur == n && isp[num[0]+num[n-1]]){ for(i=0; i<n; i++){ if(i != n-1) printf("%d ", num[i]); else printf("%d\n", num[i]); } } else{ for(i=2; i<=n; i++)if(!vis[i] && isp[num[cur-1]+i]){ num[cur] = i; vis[i] = 1; dfs(cur+1); vis[i] = 0; } } } int main(){ prime(); while(scanf("%d", &n) == 1){ cnt++; memset(vis, 0, sizeof(vis)); printf("Case %d:\n", cnt); vis[1] = 1; num[0] = 1; dfs(1); putchar('\n'); } return 0; }