您的位置:首页 > 其它

nyoj 488 && hdu 1016 素数环

2017-04-18 20:42 387 查看

素数环

时间限制:1000 ms  |  内存限制:65535 KB

难度:2

描述
有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。

为了简便起见,我们规定每个素数环都从1开始。例如,下图就是6的一个素数环。



输入有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束。输出每组第一行输出对应的Case序号,从1开始。

如果存在满足题意叙述的素数环,从小到大输出。

否则输出No Answer。样例输入
6
8
3
0

样例输出
Case 1:
1 4 3 2 5 6
1 6 5 2 3 4
Case 2:
1 2 3 8 5 6 7 4
1 2 5 8 3 4 7 6
1 4 7 6 5 8 3 2
1 6 7 4 3 8 5 2
Case 3:
No Answer

杭电的不用剪枝判断

#include<stdio.h>
#include<string.h>
int a[21],book[21];
int z[41]={0,1,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0,0,0};
int n;
void dfs(int x)
{
int k,j;
if(x==n && z[a[1]+a[x]])
{
// f=1;
for(j=1;j<n;j++)
printf("%d ",a[j]);
printf("%d\n",a
);
return ;
}

else
{
for(k=2;k<=n;k++)
{
if(z[a[x]+k]&& book[k]==0)
{
a[x+1]=k;
book[k]=1;
dfs(x+1);
book[k]=0;
}

}
}

}

int main()
{
int m=0;
while(scanf("%d",&n)&& n)
{
printf("Case %d:\n",++m);
memset(book,0,sizeof(book));
a[1]=1;
// f=0;
if(n%2==0 ||n==1){
dfs(1);
continue;
}
// if(f==0)
printf("No Answer\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  ACM