基础dfs ,用打表法避免了素数判断程序
#include <iostream>
#include <stdio.h>
#include <algorithm>
using namespace std;
int prime[40]={0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0},n=0;//素数打表,因为n最大是20,所以只要打到40
//打表法,数据小的用打表法空间换时间,就不用写个判断素数程序了
int visited[21]={0};//记录是否使用过
int a[21]={0};
void output(){
printf("1");
for(int i=2;i<=n;++i)
printf(" %d",a[i]);
printf("\n");
}
void dfs(int depth)
{ if(depth==n+1)
{ if (prime[1+a[n]])
output();
return;
}
for (int i=2;i<=n;i++)
{if(visited[i]==1||prime[a[depth-1]+i]!=1) continue;
a[depth]=i;//将x放在第depth个位置
visited[i]=1;
dfs(depth+1); //递归
visited[i]=0;//还原
}
}
int main()
{
for(int kase=1;scanf("%d",&n)!=EOF;kase++)
{printf("Case %d:\n",kase);
visited[21]={0};
a[21]={0};
visited[1]=1;
a[1]=1;
dfs(2);
printf("\n");
}
return 0;
}