NYOJ 素数环

来源:互联网 发布:电影魔方软件 编辑:程序博客网 时间:2024/06/10 17:30

 素数环

题目描述

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

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

输入

有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束。

输出

每组第一行输出对应的Case序号,从1开始。如果存在满足题意叙述的素数环,从小到大输出。否则输出No Answer。

样例输入

复制
6830

 素数环

样例输出

复制
Case 1:1 4 3 2 5 61 6 5 2 3 4Case 2:1 2 3 8 5 6 7 41 2 5 8 3 4 7 61 4 7 6 5 8 3 21 6 7 4 3 8 5 2Case 3:No Answer

提示

来源

nyoj
代码:
#include<stdio.h>#include<string.h>int n,p[100]={1,1},a[50],b[20];   //数组a用来存数据,数组b用来标记数字是否被使用void sushu()  //p数组用来标记素数,若不是素数就标记为1{    for(int i=2;i<=10;i++)     if(p[i]==0)        for(int j=2*i;j<=40;j+=i)         p[j]=1;}void dfs(int s){    if(s==n+1&&p[a[1]+a[n]]==0)  //如果环成立就输出    {        for(int i=1;i<n;i++)          printf("%d ",a[i]);          printf("%d\n",a[n]);        return ;    }    for(int i=2;i<=n;i++)    {        if(b[i]==0&&p[i+a[s-1]]==0)        {            a[s]=i;            b[i]=1;            dfs(s+1);            b[i]=0;        }    }    return ;}int main(){    int t=1;     sushu();    a[1]=1;    while(~scanf("%d",&n))    {        if(n==0) break;        memset(b,0,sizeof(b));        printf("Case %d:\n",t++);        if(n%2==0||n==1)  //剪枝,如果n是除1以外的奇数,那么一定没有结果,可以自己思考一下为什么           dfs(2);        else            printf("No Answer\n");    }    return 0;}

原创粉丝点击