Prime Ring Problem
题意:有n个数组成一个环,并且两个相邻的数相加为素数,输出符合条件的环
ps:第一次写的时候,想不起来怎样记录符合条件的数
。。看了大神的代码知道--原来辣么简单。。。
![难过](http://static.blog.csdn.net/xheditor/xheditor_emot/default/sad.gif)
代码:
#include<iostream>
#include<string.h>
using namespace std;
int prime[50],a[50],vis[50];
int n;
void is_sushu()//筛法打表
{
int i,j;
prime[0]=prime[1]=1;
for(i=2;i<50;i++)
{
if(!prime[i])
{
for(j=i+i;j<50;j+=i)
prime[j]=1;
}
}
}
void dfs(int step)
{
int i;
if(step==n+1&&!prime[a[step-1]+1])//找够了n个符合条件的数
{
for(i=1;i<n;i++)
cout<<a[i]<<" ";
cout<<a[n]<<endl;
return ;
}
for(i=2;i<=n;i++)
{
if(!vis[i]&&!prime[i+a[step-1]])//此数未用并且与上一个数相加是素数
{
a[step]=i;
vis[i]=1;
dfs(step+1);
vis[i]=0;
}
}
}
int main()
{
is_sushu();
int m=1;
a[1]=1;
while(cin>>n)
{
memset(vis,0,sizeof(vis));
cout<<"Case "<<m++<<":"<<endl;
dfs(2);
cout<<endl;
}
return 0;
}
nyoj(代码):时间限制为1s,需要进行一下剪枝
#include<stdio.h>
#include<string.h>
int n;
int a[50],b[22],vis[22];
void is_sushu()
{
int i,j;
a[0]=a[1]=1;
for(i=2; i<50; i++)
{
if(!a[i])
{
for(j=i+i; j<50; j+=i)
a[j]=1;
}
}
}
void dfs(int i,int k)
{
if(i==n)
{
if(!a[k+1])
{
for(int j=1; j<n; j++)
printf("%d ",b[j]);
printf("%d\n",b[n]);
}
return ;
}
for(int j=2; j<=n; j++)
{
if(!a[j+k]&&!vis[j])
{
vis[j]=1;
b[i+1]=j;
dfs(i+1,j);
vis[j]=0;
}
}
}
int main()
{
is_sushu();
int m=1;
b[1]=1;
while(~scanf("%d",&n)&&n)
{
memset(vis,0,sizeof(vis));
printf("Case %d:\n",m++);
if(n==1)//注意n为1时
printf("1\n");
else if(n&1)//n为奇数时,肯定会出现奇数和奇数相邻的情况,而奇数加奇数是偶数,所以应减去
printf("No Answer\n");
else
dfs(1,1);
}
return 0;
}