判断相邻两个数的和是不是素数,PS:还要判断数组第一个和最后一个。
一个典型的dfs,用vis来判断是否使用过,没有则加深,否则回溯。
#include<stdio.h>
#include<algorithm>
#include<string.h>
#include<math.h>
using namespace std;
int isp[50],n;
void cal()
{
memset(isp,0,sizeof isp);
for(int i=3;i<=31;i++)
{
int k=0;
for(int j=2;j<=sqrt(i);j++)
if(i%j==0) {k=1;break;}
if(!k) isp[i]=1;
}
}
int A[20],vis[20];
void dfs(int cur)
{
if(cur==n&&isp[A[0]+A[n-1]]){
for(int i=0;i<n;i++) printf(i==n-1?"%d\n":"%d ",A[i]);
}
else for(int i=2;i<=n;i++)
if(!vis[i]&&isp[i+A[cur-1]]){
A[cur]=i;
vis[i]=1;
dfs(cur+1);
vis[i]=0;
}
}
int main()
{
int cas=1;
cal();
while(scanf("%d",&n)!=EOF)
{
if(cas>1)
puts("");
printf("Case %d:\n",cas++);
for(int i=0;i<n;i++)
A[i]=i+1;
memset(vis,0,sizeof vis);
dfs(1);
}
return 0;
}