#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int a[30];
int makes[30];
int isprime[10001];
void bfs(int u,int n)
{
if(u==n)
{
if(isprime[a[u-1]+1])
{
printf("%d",a[0]);
for(int i=1;i<n;i++)
printf(" %d",a[i]);
cout<<endl;
}
}
for(int i=1;i<=n;i++)
{
if(makes[i])
continue;
if(isprime[a[u-1]+i])
{
makes[i]=1;
a[u]=i;
bfs(1+u,n);
makes[i]=0;
}
}
}
int main()
{
memset(isprime,1,sizeof(isprime));
for(int i=2;i<=8;i++)
{
for(int j=2*i;j<50;j+=i)
isprime[j]=0;
}
int n,c=1;
while(scanf("%d",&n)!=EOF)
{
printf("Case %d:\n",c++);
memset(makes,0,sizeof(makes));
makes[1]=1;
a[0]=1;
bfs(1,n);
cout<<endl;
}
return 0;
}
比较于回溯法求素数环还是有点容易让人理解的。上述的代码中a[30],用的很不错,既能记录素数环的数,还能进行循环的矫正。
bfs()出素数环
最新推荐文章于 2022-02-25 19:38:17 发布