本题是回溯,遍历过程就好像一棵树,需要点想象力哈~,一旦树到了尾部即输出,而且输出后并不清空,回溯后继续寻找其他解并输出。
注意本题说的是相邻数的和是素数,并不是每个数都是素数。
还有网上发现个效率特高的素数打表法,分享下咯!
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
const int N = 30;
const int INF = 1000000;
int vis[N], a[N], prime[50];
int n;
void prime_table()//高速打表
{
memset(prime, 1, sizeof(prime));
for(int i = 2; i < 50; i ++)
if(prime[i])
{
for(int j = i + i; j < 50; j += i)
prime[j] = 0;
}
}
void dfs(int x, int cnt)
{
vis[x] = 1;
if(cnt == n && prime[a[0] + a[cnt - 1]])
{
printf("%d", a[0]);
for(int i = 1; i < n; i ++)
printf(" %d", a[i]);
printf("\n");
}
for(int i = 1; i <= n; i ++)
{
if(!vis[i] && prime[a[cnt - 1] + i])
{
a[cnt] = i;
dfs(i, cnt + 1);
vis[i] = 0;
}
}
}
int main()
{
// freopen("in.txt", "r", stdin);
int Case = 1;
prime_table();
while(~scanf("%d", &n))
{
printf("Case %d:\n", Case ++);
memset(vis, 0, sizeof(vis));
memset(a, 0, sizeof(a));
a[0] = 1;
dfs(1, 1);
printf("\n");
}
}