题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016
入门级深搜问题,套用模板即可。
代码如下:
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
using namespace std;
int n;
int a[21];
int vis[21];
int check(int x)//检查两数之和是否为质数
{
int i,k;
if(x==2)return 1;
if(x<2||x%2==0)return 0;
k=sqrt(x);
for(i=3;i<=k&&x%i;i+=2);
if(i>k)return 1;
else return 0;
}
void dfs(int cur)//深搜
{
int i;
if(cur==n&&check(a[0]+a[n-1]))
{
for(int i=0;i<n;i++)
{
if(i>0)cout<<" ";
cout<<a[i];
}
cout<<endl;
}
for(i=2;i<=n;i++)
{
a[cur]=i;
if(!vis[i]&&check(a[cur]+a[cur-1]))
{
vis[i]=1;
dfs(cur+1);
vis[i]=0;
}
}
}
int main()
{
int flag=0;
while(cin>>n)
{
a[0]=1;//输出结果是每次以1为开头,顺时针方向
memset(vis,0,sizeof(vis));
printf("Case %d:\n",++flag);
dfs(1);
cout<<endl;
}
return 0;
}