Problem Descriptiona 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 the adjacent circles should is a PR Ime.
Note:the number of first circle should always be 1.
INPUTN (0 < n < 20).
Outputthe 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 is to write a program, that completes above process.
Print a blank line after each case.
Sample Input
68
Sample Output
Case 1:1 4 3 2 5 a 6 5 2 3 4Case 2:1 2 3 8 5 6 7 41 2 5 8 3 4 7 61 4 7 6 5 8 3 21 6 7 4 3 8 5 2
#include <iostream> #include <cstdio> #include <cstring>using namespace Std;int n,vis[40],ans[40], Prime[100];void init_prime () {int i,j;for (i=2;i<100;i++) {if (!prime[i]) {for (j=2*i;j<=100;j+=i) prime[j]=1;}} void Dfs (int num,int cnt) {int i;if (cnt==n) {for (i=0;i<n;i++) {if (i==0) printf ("%d", ans[i]), Else printf ("%d", Ans[i]) ;} printf ("\ n");} for (i=2;i<=n;i++) {if (vis[i]==1) continue;if (prime[i+num]==0) {if (cnt==n-1 && prime[i+1]) continue;vis[i] =1;ans[cnt]=i;dfs (i,cnt+1); vis[i]=0; }}}int Main () {int number,i,j;number=0;init_prime (); while (scanf ("%d", &n)!=eof) {printf ("Case%d:\n", ++number); memset (Vis), Ans[0]=1;vis[1]=1;dfs (vis,0,sizeof);p rintf ("\ n");} return 0;}
Copyright NOTICE: This article for Bo Master original article, without Bo Master permission not reproduced.
HDU Prime ring problem (dfs+ prime)