# include <iostream>
# include <algorithm>
using namespace std;
bool sushu[]={0, //将所有可能的和是否为素数存起来,和最大38
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,0
};
int a[21], res[21], n, flag;
void dfs(int now)
{
int i;
if (now==n&&sushu[a[n-1]+a[n]]) //now==n,已经找到完所有的符合条件的数,输出这个环
{
flag = 0;//存在素数环,flag标记为0,不输出No Answer
for (i = 0; i<n; i++)
cout<<a[i]<<" ";
cout<<endl;
}
else
{
for (i = 2; i<=n; i++)//从2往后找符合条件的数
if (!res[i]&&sushu[i+a[now-1]])//用res[]数组标记已经用过的数,如果该数没有被
{ //使用,判断是否和a[now-1]相加为素数
res[i] = 1;//标记数i已被用过
a[now] = i;//把符合条件的数存到a[]数组里,以便找完之后输出
dfs(now+1);//找下一个符合条件的数
res[i] = 0;//上一步的函数执行完之后,将i重新标记为还没有使用
}
}
}
int main()
{
int N;
N=1;
while (cin>>n&&n)
{
flag = 1;
a[0]=a[n]=1;
cout<<"Case "<<N++<<":"<<endl;
if ((n-1)&1||n==1)//n为奇数时,无法组成素数环,当n不是奇数时,寻找环
dfs(1);
if (flag)
cout<<"No Answer\n";
}
return 0;
}
素数环 南工488
最新推荐文章于 2021-07-29 23:12:55 发布