Promblem 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
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<cmath>
#include<cstring>
using namespace std;
#define MAXN 25
int n;
int ans[MAXN];
bool vis[MAXN];
bool is_prime(int n){
if(n<=1) return 0;
int m=floor(sqrt(n)+0.5);
int i;
for(i=2;i<=m;i++)
if(n%i==0) return 0;
return 1;
}
void DFS(int step){
int i;
if(step==n+1&&is_prime(ans[1]+ans[step-1])){
for(i=1;i<n;i++) cout<<ans[i]<<' ';
cout<<ans[n]<<endl;
return ;
}
else{
for(i=2;i<=n;i++){
if(!vis[i]&&is_prime(i+ans[step-1])){
ans[step]=i;
vis[i]=1;
DFS(step+1);
vis[i]=0;
}
}
}
}
int main(){
int t=1;
ans[1]=1;
while(cin>>n){
memset(vis,0,sizeof(vis));
cout<<"Case "<<t++<<':'<<endl;
DFS(2);
cout<<endl;
}
return 0;
}