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
8
Sample Output
Case 1:
1 4 3 2 5 6
1 6 5 2 3 4
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 <math.h>
#define MAX 20
int a[MAX],b[MAX],N;
int Is_Prime(int num)
{
for(int i=;i<=(int)sqrt((double)num);i++)
if(num%i==)
return ;
return ;
}
void Dfs(int n)
{
int i,j;
if(n==N && Is_Prime(a[n-]+a[]))
{
for(i=;i<N;i++)
printf(i==N-?"%d":"%d ",a[i]);//草蛋的格式
printf("\n");
}
else
{
for(i=;i<N;i++)
{
if(b[i]!= && Is_Prime(a[n-]+b[i]))
{
a[n++]=b[i];
b[i]=;
Dfs(n);
b[i]=i+;
n--;
}
}
}
}
int main()
{
int i,j,k,num=;
while(scanf("%d",&N)!=EOF)
{
a[]=;
for(i=;i<N;i++)
b[i]=i+;
printf("Case %d:\n",num++);
Dfs();
printf("\n");
}
}