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 <iostream> using namespace std; void dfs(int x); int prime[38]= { 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 1 }; int a[20],flag[20]={0}; int N,counts=0; int main() { int n; while(cin>>n) { N=n; cout<<"Case "<<++counts<<":"<<endl; if(n%2==1) break; int t=1; a[0]=1; flag[1]=0; dfs(t); cout<<endl; } return 0; } void dfs(int x) { if(x!=N) for(int i=2;i<=N;i++) { a[x]=i; if((!flag[i])&&prime[a[x-1]+a[x]]) { flag[i]=1; dfs(x+1); flag[i]=0; } } else { if(prime[a[0]+a[x-1]]) for(int i=0;i<N;i++) if(i<N-1) cout<<a[i]<<" "; else cout<<a[i]<<endl; } }