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> #include <cmath> #include <cstring> using namespace std; int sushu[50]; int a[20],vis[20]; int check(int n) { int t=sqrt(n); for(int i=2;i<=t;i++) //小于等于开房数 { if(n%i==0) return 0; } return 1; } void dp(int m,int k) //k相当于步骤 { if(k==m) //k=m-1时也要算,加一 { if(sushu[a[m-1]+a[0]]) { cout<<1; for(int i=1;i<m;i++) cout<<' '<<a[i]; cout<<endl; } return; } for(int i=2;i<=m;i++) { if(!vis[i]&&sushu[a[k-1]+i]) { a[k]=i; vis[i]=1;//三者顺序不能改 dp(m,k+1); vis[i]=0; //不可放在括号外面 } } } int main() { a[0]=1; memset(sushu,0,sizeof(sushu)); memset(vis,0,sizeof(vis)); for(int i=1;i<=32;i++) { sushu[i]=check(i); } int n; int num=0; while(cin>>n) { num++; printf("Case %d: ",num); dp(n,1); cout<<endl; } return 0; }