zoukankan      html  css  js  c++  java
  • UVA524 素数环 Prime Ring Problem

    题目OJ地址:

    https://www.luogu.org/problemnew/show/UVA524

    hdu oj 1016:  https://vjudge.net/problem/HDU-1016

    zoj 1457  :https://vjudge.net/problem/ZOJ-1457

    题意翻译

    输入正整数n,把整数1,2,...,n组成一个环,使得相邻两个整数之和均为素数。输出时,从整数1开始逆时针排列。同一个环恰好输出一次。.

    多组数据,读入到EOF结束。

    第i组数据输出前加上一行Case i:

    相邻两组数据中间加上一个空行。

    Prime Ring Problem

    A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime. 
    Note: the number of first circle should always be 1. 

    Inputn (0 < n < 20). 
    OutputThe output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in lexicographical order. 

    You are to write a program that completes above process. 

    Print a blank line after each case. 
    Sample Input

    6
    8

    Sample Output

    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
     1 #include<stdio.h>
     2 #include<stdlib.h>
     3 #include<math.h>
     4 int N;
     5 int b[21]={0};
     6 int total=0,a[21]={0};
     7 int search(int);        //回溯过程
     8 int print();            //输出方案
     9 int pd(int x,int y);    //判断素数x+y是否质数
    10 
    11 int main()
    12 {
    13     int t=0;
    14     while(scanf("%d",&N)!=EOF)
    15     {
    16         a[1]=1;
    17         for(int i=2;i<21;i++) a[i]=0;
    18         for(int i=0;i<21;i++) b[i]=0;
    19         t++;
    20         printf("Case %d:
    ",t);
    21         search(2);
    22         printf("
    ");
    23     }
    24     //printf("%d
    ",total);                    //输出总方案数
    25 }
    26 int search(int t)
    27 {
    28     int i;
    29     for(i=2;i<=N;i++)           //有20个数可选
    30      if((!b[i])&&pd(a[t-1],i))  //判断与前一个数是否构成素数及该数是否可用
    31      {
    32          a[t]=i;
    33          b[i]=1;
    34          if (t==N) { if(pd(a[N],a[1])==1) print();}
    35          else search(t+1);
    36          b[i]=0;
    37      }
    38 }
    39 int print()
    40 {
    41    int j;
    42    total++;
    43    //printf("<%d>",total);
    44    printf("%d",a[1]);
    45    for(j=2;j<=N;j++)
    46        printf(" %d",a[j]);
    47    printf("
    ");
    48 }
    49 int pd(int x,int y)
    50 {
    51     int k=2,i=x+y;
    52     while(k<=sqrt(i)&&i%k!=0) k++;
    53     if(k>sqrt(i)) return 1;
    54     else return 0;
    55 }

    本题目分析见  https://www.cnblogs.com/huashanqingzhu/p/4747009.html

    这里要注意:洛谷OJ的测试数据比较弱,n最大是16.  hdu oj和uva oj原题的n是到20的。

  • 相关阅读:
    各种alloc傻傻分不清楚
    嵌入式开发一般流程
    谈谈看门狗在嵌入式中的用法
    基于开发板的二次嵌入式开发
    谈一谈接口电路
    学习ucos和ARM体系结构的路线图
    寻找链表的中位节点(利用快慢指针)
    水箱容积问题
    盛水最多的容器
    数据结构与算法分析C语言描述第二版第79页
  • 原文地址:https://www.cnblogs.com/huashanqingzhu/p/10544228.html
Copyright © 2011-2022 走看看