素数环
时间限制:
1000 ms | 内存限制:
65535 KB
难度:
2
-
描述
-
有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。
为了简便起见,我们规定每个素数环都从1开始。例如,下图就是6的一个素数环。
代码如下:
#include<iostream>
#include<cstring>
using namespace std;
int n,prime[50];
int ring[25],vis[25];
void dfs(int k,int t)
{
int i;
if(k==n&&!prime[1+t])
{
for(i=0;i<n-1;i++)
cout<<ring[i]<<' ';
cout<<ring[i]<<endl;
}
for(i=2;i<=n;i++)
{
if(!vis[i]&&!prime[i+t])//当前第I个数用过了没,当前第I和第T个值是否为素数
{
vis[i]=1;
ring[k]=i;
dfs(k+1,i);//递归深搜
vis[i]=0;//回溯
}
}
}
int main()
{
int k=0;
int i,j;
memset(prime,0,sizeof(prime));
prime[0]=prime[1]=1;
for(i=2;i<10;i++)
{
if(!prime[i])
for(j=2*i;j<50;j+=i)
prime[j]=1;
}//筛选求素数
while(cin>>n)
{
if(n==0)
break;
cout<<"Case "<<++k<<":"<<endl;
if(n==1)
{
cout<<1<<endl;
continue;
}
if(n%2)//为奇数时候与原题冲突 直接剪掉
{
cout<<"No Answer"<<endl;
continue;
}
memset(vis,0,sizeof(vis));
ring[0]=vis[1]=1;
dfs(1,1);
}
return 0;
}