Prime Ring Problem |
A ring is composed of n (even number) circles as shown in diagram. Put natural numbers 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
n (0 < n <= 16)
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.
You are to write a program that completes above process.
1 #include<cstdio> 2 #include<cstring> 3 bool prm[35],vis[20]; 4 int a[20],n; 5 bool ck(int x) 6 { 7 int i; 8 for (i=2;i*i<=x;i++) 9 if (x%i==0) return 0; 10 return 1; 11 } 12 void dfs(int p) 13 { 14 int i,j,k,x,y,z; 15 if (p==n+1) 16 { 17 if (prm[a[n]+a[1]]) 18 { 19 printf("%d",a[1]); 20 for (i=2;i<=n;i++) 21 printf(" %d",a[i]); 22 printf(" "); 23 } 24 return; 25 } 26 for (i=2;i<=n;i++) 27 if (vis[i]==0&&prm[i+a[p-1]]) 28 { 29 a[p]=i; 30 vis[i]=1; 31 dfs(p+1); 32 vis[i]=0; 33 } 34 } 35 int main() 36 { 37 int i,j,k,p,q,x,y,z,t; 38 bool bbb=0; 39 for (i=2;i<=35;i++) 40 prm[i]=ck(i); 41 a[1]=1; 42 t=0; 43 while (scanf("%d",&n)==1) 44 { 45 if (bbb) printf(" "); 46 bbb=1; 47 memset(vis,0,sizeof(vis)); 48 vis[1]=1; 49 printf("Case %d: ",++t); 50 dfs(2); 51 } 52 }
素数环。注意边界。注意每组数据间的回车(虽然题上没说)。