很简单,注意回溯的终止条件。
#include <stdio.h>
#include <string.h>
using namespace std;
#define N1 40
#define N2 25
int Prime[N1],visted[N1],num[N2],vis[N2];
int n;
void prime()
{
int i,j;
Prime[2]=1;
for(i=3;i<N1;i+=2)
{
if(visted[i]==1)
continue;
visted[i]=1;
Prime[i]=1;
for(j=i*2;j<N1;j+=i)
{
visted[j]=1;
}
}
return;
}
void print()
{
for(int i=1;i<n;i++)
printf("%d ",num[i]);
printf("%d\n",num[n]);
return;
}
void bfs(int m)
{
if(m>n)
{
if(Prime[num[n]+num[1]]==1)
print();
return;
}
for(int i=2;i<=n;i++)
{
if(vis[i]==1)
continue;
if(Prime[num[m-1]+i]==1)
{
num[m]=i;
vis[i]=1;
bfs(m+1);
vis[i]=0;
}
}
return;
}
int main()
{
prime();
int cnt=0;
while(~scanf("%d",&n))
{
++cnt;
printf("Case %d:\n",cnt);
memset(vis,0,sizeof(vis));
num[1]=1;
vis[1]=1;
if(n==1)
printf("1\n");
else
bfs(2);
printf("\n");
}
return 0;
}