您的位置:首页 > 其它

Prime Ring Problem

2017-04-18 09:37 267 查看


Prime Ring Problem

Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)

Total Submission(s): 48837    Accepted Submission(s): 21529


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.



 

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.

 

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
/*
分类:dp
来源:prime ring problem
思路:输入奇数无解,剪枝
We are giants.
create by Lee_SD on 2017/4/
*/
#include<queue>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdio.h>
using namespace std;

using namespace std;

int ring[25];
int vis[25];
int n;
int isprime(int a){
for(int i=2;i*i<=a;i++)
if(a%i==0) return 0;
return 1;
}
void dfs(int k,int n){

if(k==n+1&&isprime(1+ring
)==1)
{
printf("1");
for(int i=2;i<=n;i++)
{
printf(" %d",ring[i]);
}
printf("\n");
return ;
}

for(int i=2;i<=n;i++)
{
if(!vis[i]&&isprime(i+ring[k-1])==1)
{
vis[i]=1;
ring[k]=i;
dfs(k+1,n);
vis[i]=0;
}
}

}
int main(){
int kase=1;
while(scanf("%d",&n)!=EOF){
printf("Case %d:\n",kase++);

if(n==1)
{
printf("1\n");
continue;
}
if(n&1)
return 0;
memset(vis,0,sizeof(vis));
vis[1]=ring[1]=1;

dfs(2,n);

printf("\n");
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: