Prime Ring Problem
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 25212 Accepted Submission(s): 11258
Problem Description
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.
Note: the number of first circle should always be 1.
![](http://acm.hdu.edu.cn/data/images/1016-1.gif)
Input
n (0 < n < 20).
Output
The 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.
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
Source
Asia 1996, Shanghai (Mainland China)
/*
算法思路:从i=1开始进行往后面进行搜索。然后依次判断
a[i]+a[i+1]是否为素数,其实本题不用搜索也可以的,
只要依次把他们进行相加就行了
TLE
用枚举的话,用两重循环,依次相加,但是要找出一整串的数据还是会超时的
*/
#include<stdio.h>
#include<string.h>
#define max 21
int a[max];
int vis[max];
int n;
int Case=1;
/*
判断是否为素数的一个函数
*/
int isp(int i)
{
if(i==1||i==2)
return 1;
else
for(int j=2;j<i;j++)
if(i%j==0)
return 0;
return 1;
}
/*
搜索函数的构造
*/
void dfs(int cur)
{
if(cur==n&&isp(a[0]+a[n-1]))//也可以说是边界判断吧,当搜索的cur到了n时,就可以停止了,注意还要判断第一个和最后一个是否相等
{
for(int i=0;i<n-1;i++)
printf("%d ",a[i]);
printf("%d",a[n-1]);//格式控制
printf("\n");
}
else
for(int i=2;i<=n;i++)//依次往后面进行判断
if(!vis[i]&&isp(i+a[cur-1]))//判断这个数是否被用过,算是剪枝吧,然后判断当前的数和前面这个数和是否为素数
{
a[cur]=i;//如果是素数的话就把这个值赋值到这个表里面
vis[i]=1;//标记这个数已经用过
dfs(cur+1);//继续回溯,搜索下面这个数的一条新的素数路径
vis[i]=0;//再把值回到原来的
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
{
memset(vis,0,sizeof(vis));
a[0]=1;//将搜索值为1
printf("Case %d:\n",Case);
dfs(1);//搜索为1从一开始进行搜索
Case++;
printf("\n");
}
return 0;
}