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格式变态,一直以为最后不输出空行,PE6次,简单的dfs.由于数据较小,直接素数手动打表了,懒得写函数。显然奇数是不成立的,所以只能输入偶数。#include<stdio.h> #include<string.h> int value[40]={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,0,0}; //素数打表,1素数,0非素数。从0-40. int v[25],a[25]; //v作为使用的标记,a储存n个数 void dfs(int x,int y) { int i; if(x==y+1&&value[a[1]+a[y]]==1) //x递归到y+1尸,且最后一个数跟1的和是素数 结束 { printf("1"); //1每次都作为开头输出 for(i=2;i<=y;i++) printf(" %d",a[i]); //注意空格 printf("\n"); //空行 return ; } for(i=2;i<=y;i++) //从2开始计数 { if(v[i]==0&&value[i+a[x-1]]) //i没被利用且这个数加数组a中的前一个数是素数 { v[i]=1; //标记 a[x]=i; //储存 dfs(x+1,y); //回溯 v[i]=0; //恢复原状态 } } } int main() { int T=1,i,n; while(scanf("%d",&n)!=EOF) { printf("Case %d:\n",T++); if(n==1) //1单独处理 { printf("1\n"); continue; } // if(n%2==1) // { // printf("No Answer\n"); //奇数不成立 // flag=1; // continue; // } memset(v,0,sizeof(v)); //清空数组v为0 v[1]=a[1]=1; //当n=1时,成立 dfs(2,n); printf("\n"); //狗血的换行 } return 0; }