http://acm.hdu.edu.cn/showproblem.php?pid=1016
这是一道dfs入门题,题意简单,注意两个地方,一个是n为奇数时有两个奇数相邻,此时肯定无素数环,第二个是对于不同的dfs定义有不同的实现方法,个人建议入门应该尝试各种定义的dfs进行实现,看了下其他人写的代码稍加修改了下
#include <cstdio>
#include <iostream>
using namespace std;
int prim[40];
int path[25];
int n;
bool visited[25];
void get_prim(void ){//筛法打表
fill(prim,prim+40,1);
for(int i=2;i<40;i++){
if(prim[i]){
for(int j=i*i;j<40;j+=i)
prim[j]=0;
}
}
}
void dfs(int m){
if(m==n+1&&prim[path[n]+1]){
printf("%d",path[1]);
for(int i=2;i<=n;i++)
printf(" %d",path[i]);
printf("\n");
}
else for(int i=2;i<=n;i++)
if(!visited[i]&&prim[i+path[m-1]]){
visited[i]=true;
path[m]=i;
dfs(m+1);
visited[i]=false;
}
}
int main()
{
int cont=1;
path[1]=1;
get_prim();
while(scanf("%d",&n)!=EOF){
fill(visited,visited+25,false);
visited[1]=true;
printf("Case %d:\n",cont++);
if(!(n%2))
dfs(2);
printf("\n");
}
return 0;
}