Problem description:
输入正整数n,把整数1,2,3,.....,n组成一个环,使得相邻的两个整数和为素数。输出时从整数1开始逆时针排序。同一个环恰好输出一次。n小于等于16。
代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;
int n,c[1000],vis[20],tru=1;
int isp(int n)
{
for(int i=2;i<=sqrt(n);i++)
if(n%i==0) return 0;
return 1;
}
void dfs(int cur)
{
if(n==cur&&isp(c[0]+c[n-1])) //递归边界,测试第一个数和组后一个数
{
tru=1;
for(int i=0;i<n;i++) printf("%d ",c[i]);
printf("\n");
return;
}
for(int i=2;i<=n;i++) //尝试防止每一个数
if(!vis[i]&&isp(i+c[cur-1])) //判断条件,没被用过,且与前一个和是素数
{
c[cur]=i;
vis[i]=1; //设置使用标志
dfs(cur+1);
vis[i]=0; //清楚使用标志
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
tru=0;
memset(vis,0,sizeof(vis));
c[0]=1;vis[1]=1;
dfs(1);
if(!tru) printf("None!\n");
}
return 0;
}