这个题目要求就是用1-n 这n个整数构成一个换 使得环中每个数和相邻的两个数分别相加 和是素数 从1开始
按照字典序输出
直接dfs
想法是 数组arr 存这个环中的数字 从下标0开始
vis【i】表示 i是否被用过
后来在算法竞赛入门经典里面也看到过这个题目 蛮经典的
#include<iostream>
#include<cstring>
#include<cstdio>
const int maxn=22;
bool prime[maxn*2];
int arr[maxn];
bool vis[maxn];
int n;
void init()
{
prime[1]=0;
for(int i=2;i<=40;++i)
{
prime[i]=1;
for(int j=2;j*j<=i;++j)
{
if(i%j==0)
{
prime[i]=0;
break;
}
}
}
}
void dfs(int a)
{
int i;
if(a==n && prime[arr[a-1]+1])
{
printf("1");
for(i=1;i<n;++i)
printf(" %d",arr[i]);
printf("\n");
}
for(i=2;i<=n;++i)
{
if(!vis[i] && prime[i+arr[a-1]])
{
vis[i]=1;
arr[a]=i;
dfs(a+1);
vis[i]=0;
}
}
return ;
}
int main()
{
init();
int ca=1;
while(scanf("%d",&n)!=EOF)
{
memset(vis,0,sizeof(vis));
printf("Case %d:\n",ca++);
arr[0]=1;
vis[1]=1;
if(n%2==0)
dfs(1);
printf("\n");
}
return 0;
}