• NYOJ488 素数环


     

    素数环

    时间限制: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
    
     1 /* 
     2    功能Function Description:     NYOJ-488
     3    开发环境Environment:          DEV C++ 4.9.9.1
     4    技术特点Technique:
     5    版本Version:
     6    作者Author:                   可笑痴狂
     7    日期Date:                      20120815
     8    备注Notes:
     9    素数环:给定n,1~n组成一个素数环,相邻两个数的和为素数。
    10     首先偶数(2例外,但是本题不会出现两个数的和为2)不是素数,
    11     所以素数环里奇偶间隔。如果n是奇数,必定有两个奇数相邻的情况。
    12     所以当n为奇数时,输出“No Answer”。
    13     当n == 1时只1个数,算作自环,输出1
    14     所有n为偶数的情况都能变成奇偶间隔的环-----所以都有结果。
    15 */
    16 #include<stdio.h>
    17 #include<string.h>
    18 
    19 int prime[40]={1,1,0,0,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,0,1,1,1,0,1,1,1,1,1,0,1,0,1,1,01,1,1,0,1,1};
    20 int visit[21];
    21 int ring[21];
    22 
    23 /*
    24 void Is_prime()
    25 {
    26     int i,j;
    27     prime[0]=prime[1]=1;
    28     for(i=2;i<=6;++i)
    29         for(j=i*i;j<40;j+=i)
    30             prime[j]=1;
    31 }
    32 */
    33 void DFS(int k,int n)
    34 {
    35     int i;
    36     if(k==n+1&&prime[ring[n]+ring[1]]==0)
    37     {
    38         printf("1");
    39         for(i=2;i<=n;++i)
    40             printf(" %d",ring[i]);
    41         printf("\n");
    42         return;
    43     }
    44     for(i=2;i<=n;++i)
    45     {
    46         if(!visit[i]&&!prime[i+ring[k-1]])
    47         {
    48             visit[i]=1;
    49             ring[k]=i;
    50             DFS(k+1,n);
    51             visit[i]=0;
    52         }
    53     }
    54 }
    55 
    56 int main()
    57 {
    58     int T,n;
    59     T=1;
    60 //    Is_prime();
    61     while(scanf("%d",&n),n)
    62     {
    63         printf("Case %d:\n",T++);
    64         if(n==1)
    65         {
    66             printf("1\n");
    67             continue;
    68         }
    69         if(n&1)
    70         {
    71             printf("No Answer\n");
    72             continue;
    73         }
    74         memset(visit,0,sizeof(visit));
    75         visit[1]=ring[1]=1;
    76         DFS(2,n);
    77     }
    78     return 0;
    79 }
    
    
    功不成,身已退
  • 相关阅读:
    Eclipse项目上传和下载到码云上
    java.lang.IllegalArgumentException,java.util.zip.ZipException 解决办法
    #{}和${}的区别
    Lambda 表达式
    存储器的按字寻址和按字节寻址
    二叉树的三种遍历方式
    线性表和链表
    java泛型理解
    java字符输入输出流
    applet的生命周期
  • 原文地址:https://www.cnblogs.com/dongsheng/p/2639452.html
Copyright © 2020-2023  润新知