思路:需要用到dfs,从
1开始,依次检查每一个没有被用过的数字是否与当前数字之和为质数, 当递归次数达到n-1,并且第一个数和最后最后一个数的和也是质数,就退出递归输出结果;若递归次数还未达到n-1,但找到一个能和当前数字加起来是质数的数,就标记该数已经访问过,并进入下一层递归;如果遍历所有数都没有找到这样一个数,即当前递归已经执行完了,自动返回上一层递归,并把该层填的数的访问标志置为0,意味着这层递归填这个数是错的,并执行i++继续搜寻下一个可能的数。
#include <iostream>
using namespace std;
int a[25];
int vis[25];
int n;
int isprime(int n)
{
if(n<2)
return false;
for (int i=2; i*i<=n; i++)
{
if(n%i==0)
return false;
}
return true;
}
void dfs(int num)
{
if(num==n-1&&isprime(a[0]+a[n-1])) //递归终止条件
{
for(int i=0; i<n-1; i++)
{
cout<<a[i]<<" ";
}
cout<<a[n-1]<<endl;
}
else
{
for(int i=2; i<=n; i++)
{
if(isprime(a[num]+i)&&!vis[i])
{
a[num+1]=i; //填数
vis[i]=1; //置访问标记为1
dfs(num+1);
vis[i]=0; //下一级dfs执行到底了才会执行这一步,
//说明下一级dfs遍历所有数都没有找到符合条件的,
//因此这一级dfs填的数是错的,置访问标记为0
}
}
}
}
int main()
{
int cas=0;
while(cin>>n)
{
memset(vis,0,sizeof(vis));
a[0]=1;
cas++;
cout<<"Case "<<cas<<":"<<endl;
dfs(0);
cout<<endl;
}
return 0;
}