UVA524 素数环 Prime Ring Problem
Posted huashanqingzhu
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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的。
以上是关于UVA524 素数环 Prime Ring Problem的主要内容,如果未能解决你的问题,请参考以下文章
例题7-4 素数环 Prime Ring Problem UVA - 524
UVa524 Prime Ring Problem (回溯法)
[2016-02-19][UVA][524][Prime Ring Problem]