这是一道比较简单的深搜,适合入门者学习实践。。。。一开始对递归不是很了解,所以程序转的稀里糊涂!尤其注意那几个return。
加油!所以的DS——程序员
#include<iostream>
#include<cmath>#include<algorithm>
#include<cstring>
using namespace std;
int a[21],n; //记录可行数据
int s[21]; //标记
bool prime(int n)
{
for(int i=2;i<=sqrt(n);i++)
{
if(n%i==0) return 0;
}
return 1;
}
void dfs(int m)
{
if(m==n+1&&prime(a[m-1]+1))
{
for(int i=1;i<=n;i++)
{
cout<<a[i]<<" ";
if(i==n)cout<<endl;
}
return;
}
for(int i=2;i<=n;i++)
{
if(prime(a[m-1]+i)&&s[i]==0)
{
s[i]=1; //标记走过
a[m]=i; //加入可行集合
dfs(m+1);//递归
s[i]=0; //回溯
}
}
return;
}
int main()
{
int k=0;
while(cin>>n)
{
if(n%2==1)continue;
cout<<"Case "<<++k<<":"<<endl;
memset(s,0,sizeof(s));
a[1]=1;
dfs(2);
cout<<endl;
}
}