问题描述
如图所示,一个环由n个圆组成。把自然数1,2,…,n分别放入每个圆中,两个相邻圆中的数之和应为素数。
注:第一个圆的数目应始终为1。
输入
n(0<n<20)
输出
输出格式如下所示。
每一行代表环中从1开始的一系列圈数。
数字顺序必须满足上述要求。按字典顺序打印解决方案。你要写一个程序来完成上述过程。
在每个案例后打印一个空行。
样本输入
6
8
样本输出
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 <algorithm>
# include <cstring>
using namespace std;
int v[25];//做标记
int s[25];//存放
int p(int n)//素数筛选
{
if(n<2)
return 0;
else{
for(int i=2;i*i<=n;i++)
if(n%i==0)
return 0;
return 1;
}
}
void dfs(int num, int n){ //深搜
if(num==n&&p(s[n]+1)==1) //相等时说明已经是完整序列
//并且保证第一个和末尾相加
//依然为素数
{
for(int i=1;i<n;i++)
cout<<s[i]<<" ";
cout<<s[n]<<endl; //出口,为了格式最后一位后有空格
}
else
{
for(int i=2;i<=n;i++){
if(v[i]==0&&p(i+s[num])==1) //没有出现过并且
//与前一项和为素数
{
v[i]=1; //出现后标记
s[num+1]=i; //符合条件存入数组
dfs(num+1,n); //进入下一个
v[i]=0; //消出标记,进行下一串。
}
}
}
}
int main()
{
int n,c=1;
while(cin>>n){
memset(v,0,sizeof(v));
memset(s,0,sizeof(s));
s[1]=1;
// v[1]=1;
printf("Case %d\n",c);
c++;
dfs(1,n);
printf("\n");
}
}