题目大意:有n个数(1~n)组成的圆环,求使相邻两数之和为素数的解
0<n<=16,从1开始输出,多解升序
解题思路:用回溯法,若一个数与前面的和不是素数,则判断下一个
注意事项:
多组数据之间有空行
最后一组数据后面没空行(不然会WA)
Case x 后面还有冒号别掉
#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int n;
bool isp[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
};
bool v[40];
int a[40];
void huisu(int x)
{
if(x==n&&isp[a[0]+a[n-1]]) //递归边界
{
for(int i=0;i<n;++i)
{
cout<<a[i]; //输出结果
if(i!=n-1)
cout<<' ';
}
cout<<endl;
}
else
{
for(int i=2;i<=n;++i) //尝试放置每个数i
{
if(!v[i]&&isp[i+a[x-1]]) //i没使用且与前面之和为素素
{
a[x]=i;
v[i]=1;
huisu(x+1);
v[i]=0;
}
}
}
}
int main()
{
int t=1;
while(cin>>n)
{
if(t!=1)
cout<<endl;
cout<<"Case "<<t++<<':'<<endl;
memset(v,0,sizeof(v));
memset(a,0,sizeof(a));
v[1]=1;
a[0]=1;
huisu(1);
}
return 0;
}