少见的一次性写对的代码
不过注意的一点是对于dfs中visited一定要记得第一次调用dfs的时候就要设置为1
还有就是险些错误的就是dfs的终止条件的判断,虽然n代表环的节点总数但是序列数组是从0开始的!
#include <iostream>
#include<cstdio>#include<cstring>
using namespace std;
int n,k;
int visited[20];
int seq[20];
int isPrime[50];
void print()
{
for(int i=0;i<n;i++)
{
if(i!=0)putchar(' ');
printf("%d",seq[i]);
}
putchar('\n');
}
void dfs(int num)
{
if(num==n&&isPrime[seq[num-1]+1])
{
print();
return ;
}
for(int i=2;i<=n;i++)
{
if(!visited[i]&&isPrime[i+seq[num-1]])
{
seq[num]=i;
visited[i]=1;
dfs(num+1);
visited[i]=0;
}
}
}
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
for(int i=2;i<=40;i++)
{
isPrime[i]=1;
for(int j=2;j*j<=i;j++)
{
if(i%j==0)
{
isPrime[i]=0;
break;
}
}
}
while(scanf("%d",&n)==1)
{
k++;
printf("Case %d:\n",k);
memset(seq,0,sizeof(seq));
memset(visited,0,sizeof(visited));
visited[1]=1;
seq[0]=1;
dfs(1);
putchar('\n');
}
return 0;
}