题目回顾(HDU-1016):
Prime Ring Problem
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.
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.
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<string.h> using namespace std; int judge[41]={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,0 };//素数的打表 int mark[21];//用作标记是否这个数已经使用过 int y[21];//答案数组 int n; void dfs(int a){ //如果所有数字确定,那么判断首尾相加是否也是素数, //若是,则满足条件,输出 if(a==n&&judge[y[1]+y[n]]){ for(int i=1;i<n;i++){ cout<<y[i]<<" "; } cout<<y[n]<<endl; return; } //深搜,不断找出未被标记且与此数相加为素数的下一个数 for(int i=1;i<=n;i++){ if(mark[i]==0&&judge[y[a]+i]){ y[a+1]=i; mark[i]=1; dfs(a+1); mark[i]=0; } } } int main(){ int c=1; while(cin>>n){ cout<<"Case "<<c++<<":"<<endl; memset(y,0,sizeof(y)); memset(mark,0,sizeof(mark)); y[1]=1; mark[1]=1; dfs(1); cout<<endl; } return 0; }
原文地址:https://www.cnblogs.com/orangecyh/p/9873675.html