Prime Ring Problem
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.
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
#include<cstdio>
#include<cstring>
int f[25],sh[45]={0},l[25],n,kase=0;//f[i]记录i是否已用,l[i]记录合法的环
void DFS(int num,int sol){//num是前一个数字,sol是位置
if(sol==n&&!sh[num+1]){//1就是那个起始数字
for(int i=0;i<n;i++){
if(i!=0) printf(" ");//注意输出格式
printf("%d",l[i]);
}
printf("\n");
}
for(int i=1;i<=n;i++)
if(!f[i]&&!sh[num+i]){
f[i]=1;//标记已用
l[sol]=i;
DFS(i,sol+1);
f[i]=0;//回溯
}
}
int main(){
sh[1]=1;
for(int i=2;i<22;i++)//筛选法打表,素数用0标记
for(int j=i+i;j<45;j+=i)
sh[j]=1;//非素数用1标记
while(scanf("%d",&n)!=EOF){
printf("Case %d:\n",++kase);
memset(f,0,sizeof(f));
memset(l,0,sizeof(l));
l[0]=1;//起始位置是1
f[1]=1;//1用过了
DFS(1,1);
printf("\n");
}
return 0;
}