码迷,mamicode.com
首页 > 其他好文 > 详细

UVA524 素数环 Prime Ring Problem

时间:2019-03-16 20:49:40      阅读:168      评论:0      收藏:0      [点我收藏+]

标签:clu   ash   format   逆时针   中间   lex   begin   input   dia   

题目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:\n",t);
21         search(2);
22         printf("\n");
23     }
24     //printf("%d\n",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("\n");
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的。

 

UVA524 素数环 Prime Ring Problem

标签:clu   ash   format   逆时针   中间   lex   begin   input   dia   

原文地址:https://www.cnblogs.com/huashanqingzhu/p/10544228.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!