素数环
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。
为了简便起见,我们规定每个素数环都从1开始。例如,下图就是6的一个素数环。
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int n,a[25],b[25],ans;
int v[25];
void dfs(int k,int n)
{
if(k==n+1&&!b[v[n]+1])
{
printf("1");
for(int i=2;i<=n;i++)
printf(" %d",v[i]);
printf("\n");
return;
}
for(int i=2;i<=n;i++)
{
if(!a[i]&&!b[v[k-1]+i])
{
a[i]=1;
v[k]=i;
dfs(k+1,n);
a[i]=0;
}
}
}
void isPrime()
{
memset(b,0,sizeof(b));
b[1]=1;
for(int i=2;i<=6;i++)
if(!b[i])
for(int j=i*i;j<36;j+=i)
b[j]=1;
}
int main()
{
int kase=1;
isPrime();
while(~scanf("%d",&n),n)
{
v[1]=a[1]=1;
printf("Case %d:\n",kase++);
if(n==1) printf("1\n");
else if(n%2==0)
dfs(2,n);
else printf("No Answer\n");
}
return 0;
}
由于是刚学的dfs,所以不是太会,做出来后有些问题解决不了,就参考了一下别人的思路和代码。
以下是我参考的,比我写的要好的多。。
可以看看。。
http://www.cnblogs.com/dongsheng/archive/2012/08/15/2639452.html