问题描述:素数环:起始点为1,相邻两个数之和为素数。
问有多少个素数环?
解题思路:经典的DFS啊,不满足条件就回溯,直到找到一个解输出即可。。。
需要注意的是,HDU上这道题的数据很水,所以不剪枝也能过,但是其他OJ上就通不过了。。(这就比较坑了),所以需要剪枝的地方就是奇数的时候是无解的,不必DFS了!
代码实现:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int a[25], vis[25];
int k, n;
int IsPrime(int n)//判断素数
{
for(int i = 2; i <= sqrt(n); i++)
{
if(n % i == 0) return 0;
}
return 1;
}
void dfs(int x)
{
if(k==2 && !IsPrime(1+x)) return;
if(k==n && IsPrime(1+x))//边界条件
{
//输出答案
printf("%d", a[0]);
for(int i = 1; i < n; i++)
{
printf(" %d", a[i]);
}
printf("\n");
return;
}
for(int i = 2; i <= n; i++)
{
if(!vis[i] && IsPrime(x+i))
{
vis[i] = 1;
a[k++] = i;
dfs(i);
vis[i] = 0;
k--;
}
}
return;
}
int main()
{
int i, t = 1;
while(scanf("%d", &n) != EOF)
{
a[0] = 1;
printf("Case %d:\n", t++);
if(n % 2)//奇数无解。。。
{
continue;
}
for(i = 2; i <= n; i++)//遍历第二个数
{
a[1] = i;
k = 2;
memset(vis,0,sizeof(vis));
vis[1] = 1;
vis[i] = 1;
dfs(i);
}
printf("\n");
}
}