zoukankan      html  css  js  c++  java
  • nyoj 488素数环

    素数环

    时间限制: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

    /* 
        素数环:给定n,1~n组成一个素数环,相邻两个数的和为素数。
        首先偶数(2例外,但是本题不会出现两个数的和为2)不是素数,
         所以素数环里奇偶间隔。如果n是奇数,必定有两个奇数相邻的情况。
         所以当n为奇数时,输出“No Answer”。
         当n == 1时只1个数,算作自环,输出1
         所有n为偶数的情况都能变成奇偶间隔的环-----所以都有结果。
     */
    #include<stdio.h>
    #include<string.h> 
     int prime[40];
     int visit[21];
     int a[21];
     void Is_prime()
     {
         int i,j;
         prime[0]=prime[1]=1;
         for(i=2;i<=6;++i)
             for(j=i*i;j<40;j+=i)
                 prime[j]=1;
     }
     void DFS(int k,int n)
    {
         int i;
         if(k==n+1&&prime[a[n]+a[1]]==0)
         {
             printf("1");
             for(i=2;i<=n;++i)
                printf(" %d",a[i]);
             printf("
    ");
             return;
        }
         for(i=2;i<=n;++i)
         {
             if(!visit[i]&&!prime[i+a[k-1]])
             {
                 visit[i]=1;
                 a[k]=i;
                 DFS(k+1,n);
                 visit[i]=0;
             }
         }
     }
     
     int main()
     {
         int T,n;
         T=1;
         Is_prime();
         while(scanf("%d",&n),n)
         {
             printf("Case %d:
    ",T++);
             if(n==1)
            {
                 printf("1
    ");
                 continue;
             }
             if(n&1)
             {
                 printf("No Answer
    ");
                 continue;
             }
             memset(visit,0,sizeof(visit));
             visit[1]=a[1]=1;
             DFS(2,n);
         }
         return 0;
     }
    

      

  • 相关阅读:
    算法15 《啊哈算法》第四章 盒子装扑克-DFS深度优先搜索 递归
    算法14 leetcode28 实现 strStr() kmp
    markdown一些有用笔记
    算法11 leetcode274 有效的字母异位词
    Quantity? Quality!
    算法 10 leetcode344. 反转字符串
    JavaWeb —— JDBC Driver驱动及连接问题
    Python —— 4 习题练习
    Python —— 变量的作用域
    JavaWeb —— 文件上传
  • 原文地址:https://www.cnblogs.com/zhangliu/p/7052592.html
Copyright © 2011-2022 走看看