您的位置:首页 > 其它

HDU Prime Ring Problem (DFS+素数打表)

2015-08-14 14:40 393 查看
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


#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int n,vis[40],ans[40],prime[100];

void init_prime()
{
int i,j;
for(i=2;i<100;i++) {
if(!prime[i]){
for(j=2*i;j<=100;j+=i) prime[j]=1;
}
}
}

void dfs(int num,int cnt)
{
int i;
if(cnt==n) {
for(i=0;i<n;i++) {
if(i==0) printf("%d",ans[i]);
else printf(" %d",ans[i]);
}
printf("\n");
}
for(i=2;i<=n;i++) {
if(vis[i]==1) continue;
if(prime[i+num]==0) {
if(cnt==n-1 && prime[i+1]) continue;
vis[i]=1;
ans[cnt]=i;
dfs(i,cnt+1);
vis[i]=0;
}
}

}

int main()
{
int number,i,j;
number=0;
init_prime();
while(scanf("%d",&n)!=EOF){
printf("Case %d:\n",++number);
memset(vis,0,sizeof(vis));
ans[0]=1;
vis[1]=1;
dfs(1,1);
printf("\n");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: