DFS,好像主要是对dfs的递归调用吧,自己也不太懂,

总之,它很神奇,多看看代码吧

 

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>

int n;
int isp[100];
int vis[100];
int A[100];

int is_prime(int x) //判断一个数是否为素数(该数比较小,不会引起超时)
{
int i=1,k;
for(i=2;i<=(k=(int)sqrt(x));i++)
if(x % i == 0)break;
if(i<=k)return 0;
else return 1;
return x;
}


void dfs(int cur) //深搜寻路
{
if(cur == n && isp[A[0] + A[n-1]]) //递归边界,别忘了保证第一个和最后一个数,环结构
{
int i;
printf("1");
for(i=1;i<n;i++)
printf(" %d",A[i]); //打印方案
printf("\n");
}
else
{
int i;
for(i=2;i<=n;i++) //尝试放置每个数 i
if(!vis[i] && isp[i + A[cur-1]]) //如果 i 没有用过,且与前一个数之和为素数
{
A[cur] = i;
vis[i] = 1; //设置使用标志,表明用过
dfs(cur + 1);
vis[i] = 0; //清除标记
}
}
}


int main()
{
int N,i;
for(i=2;i<=200;i++)
isp[i] = is_prime(i); //生成素数表(较小范围的素数表,大范围的用素数筛法)
while(scanf("%d",&N) == 1,N)
{
n = N;
A[0] = 1;
dfs(1);
}
return 0;
}