题目链接http://acm.hdu.edu.cn/showproblem.php?pid=1016
素数环问题的解决可以使用深度优先搜素来解决
下面是AC代码
#include <iostream>
#include <algorithm>
#include <string.h>
#include <cmath>
using namespace std;
const int maxn=25;
bool visit[maxn];//存储访问状态的数组
int num[maxn];//存储最终结果的数组num[i] = 1意味着第一位的数字是1;
int n;
bool prime(int n)//判断素数的函数
{
if(n==1)
return false;
if(n==2)
return true;
if(n%2==0)
return false;
for(int i=3;i<=(int)sqrt(n);i+=2)
if(n%i==0)
return false;
return true;
}
void dfs(int step)//深度优先搜索,按位搜索
{
if(step>n&&prime(num[n]+num[1]))//所有数位均已搜索完毕
{
for(int i = 1; i <= (n-1); i++)
{
printf("%d ", num[i]);
}
printf("%d\n", num[n]);
}
for(int i=2;i<=n;i++)
{
num[step]=i;//枚举该位所有可能的情况
//保证素数环依旧成立
//保证i这个数没有被用过
if(prime(num[step]+num[step-1])&&!visit[i])//继续向下搜索的条件
{
visit[i]=1;
dfs(step+1);
visit[i]=0;
}
}
}
int main()
{
int c=1;
while(scanf("%d", &n) != EOF)
{
printf("Case %d:\n", c);
c++;
memset(visit,0,sizeof(visit));
num[1]=1;
dfs(2);
printf("\n");
}
return 0;
}