UVA524 素数环 Prime Ring Problem

时间:2023-03-09 06:54:45
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.

UVA524 素数环 Prime Ring Problem

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
 #include<stdio.h>
#include<stdlib.h>
#include<math.h>
int N;
int b[]={};
int total=,a[]={};
int search(int); //回溯过程
int print(); //输出方案
int pd(int x,int y); //判断素数x+y是否质数 int main()
{
int t=;
while(scanf("%d",&N)!=EOF)
{
a[]=;
for(int i=;i<;i++) a[i]=;
for(int i=;i<;i++) b[i]=;
t++;
printf("Case %d:\n",t);
search();
printf("\n");
}
//printf("%d\n",total); //输出总方案数
}
int search(int t)
{
int i;
for(i=;i<=N;i++) //有20个数可选
if((!b[i])&&pd(a[t-],i)) //判断与前一个数是否构成素数及该数是否可用
{
a[t]=i;
b[i]=;
if (t==N) { if(pd(a[N],a[])==) print();}
else search(t+);
b[i]=;
}
}
int print()
{
int j;
total++;
//printf("<%d>",total);
printf("%d",a[]);
for(j=;j<=N;j++)
printf(" %d",a[j]);
printf("\n");
}
int pd(int x,int y)
{
int k=,i=x+y;
while(k<=sqrt(i)&&i%k!=) k++;
if(k>sqrt(i)) return ;
else return ;
}

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

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