题意:求素数环,相邻的两个环的和必须是素数,求出所有符合的结果。<br />
思路:先将40以内的素数打出来,然后进行dfs搜索,deep是用来判断搜的深度,当深度与n相等的时候,输出结果.
#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
int visit[100],a[100],n,m,makeprime[200],k = 0,mark[100];
//visit代表数组有没有被访问,makerprime判断是否是素数,mark存正确的元素
void init()
{
for(int i =1 ; i <= n ; i ++)
{
a[i] = i;
}
}
void prime()//找出40以内的素数,如果是的话标记为1
{
makeprime[2] = 1;
for(int i = 3 ; i <= 40 ; i++)
{
int j;
int flag = 0;
for( j = 2 ; j*j<=i ; j++)
{
if(i % j == 0)
{
flag = 1;
break;
}
}
if(!flag)
{
makeprime[i] = 1;
}
}
}
void dfs(int deep,int m)//进行dfs
{
for(int i = 2 ; i <= n ; i ++)
{
if(deep == n && makeprime[(m + 1)] )//如果当搜到最后一层且与最后一个+1是素数则输出
{
int count1 = 0;
cout<<a[1]<<" ";
for(int j = 0 ; j <k-1 ; j++)
{
cout<<mark[j]<<" ";
}
cout<<mark[k-1]<<endl;
return;
}
else if(!visit[i] && makeprime[(m + a[i])] )
{
visit[i] = 1;
mark[k++] = a[i];
dfs(deep+1,a[i]);
visit[i] = 0;
k--;
}
}
}
int main()
{
int case1 = 1;
memset(makeprime,0,sizeof(makeprime));
prime();//这个放到外面可以减小时间复杂度,避免超时
while(cin >> n)
{
k = 0;
memset(visit,0,sizeof(visit));
memset(a,0,sizeof(a));
visit[1] = 1;
cout<<"Case "<<case1<<":"<<endl;
case1++;
init();
dfs(1,1);
cout<<endl;
}
return 0;
}