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.
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 题意:给n个数,把1到n组成一个如上图所示的素数环:顾名思义,就是在该环中,任意两个相邻的数之和为素数题解:用深搜一个个搜索,题目规定是从1 开始,所以由1开始,在1----n-1个数时只需要两个相邻的数之和为素数,重点就在最后一个数,要考虑它和上一个数之和是否
是素数,还要考虑它和1 之和是否是素数,两者都符合的就可以组成一个素数环啦。
代码展示:
#include<iostream>
#include<cstring>
using namespace std;
int prim[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,1};
int sign[22],flag[22];
int n;
void dfs(int s)
{
int i;
if(s > n) return;
if(s == n)
{
for(i = 0;i < n-1;i++)
cout<<flag[i]<<" ";
cout<<flag[n-1]<<endl;
return;
}
for(i = 2;i <= n;i++)
{
if(sign[i] == 1) continue;
if(s+1 == n)
{
if(prim[i+1] == 1 && prim[flag[s-1] + i] == 1)
{
flag[s] = i;
sign[i] = 1;
dfs(s+1);
sign[i] = 0;
}
}
else
{
if(prim[i+flag[s-1]] == 1)
{
flag[s] = i;
sign[i] = 1;
dfs(s+1);
sign[i] = 0;
}
}
}
return;
}
int main()
{
int m = 1;
while(cin>>n)
{
if(m > 1) cout<<endl;
memset(sign,0,sizeof(sign));
memset(flag,0,sizeof(flag));
sign[0] = 1;
flag[0] = 1;
cout<<"Case "<<m++<<":"<<endl;
dfs(1);
}
return 0;
}