题意 给你一个n 对1 … n n个数排序 1必须在第一位 两个数相加要为素数(1与最后一个数相加也必须为素数) 输出所有满足上述的序列。
思路 我们先1~n分别求出与它相加为素数的数存进数组,然后就相当于建了一个图 从1出发 一层一层向下推 基础DFS 然后在回溯一下 记录路径。
#include<iostream>
using namespace std;
int isprime[50]={0};
int a[20],book[20];
int n;
//打印素数表 ,其中0表示素数
void get_prime()
{
int i,j;
for(i=2;i<8;i++)
// if(!isprime[i])
for(j=i*i;j<45;j+=i)
isprime[j]=1;
}
void dfs(int step)
{
//注意终止条件是n+1和是素数
if(step==n+1&&!isprime[a[n]+a[1]])
{
for(int i=1;i<n;i++)
{
cout<<a[i]<<" ";
}
cout<<a[n]<<endl;
return ;
}
for(int i=2;i<=n;i++)
{
//判断是否访问过以及是否为素数
if(book[i]==0 && isprime[i+a[step-1]]==0)
{
a[step]=i;
book[i]=1;
dfs(step+1);
book[i]=0;
}
}
return;
}
int main()
{
int flag=1;
while(cin>>n)
{
a[1]=1;
get_prime();
cout<<"Case "<<flag++<<":"<<endl;
//注意此时dfs的值为2,因为每次第一个数都是1
dfs(2);
book[1]=1;
cout<<endl;
}
}