C语言素数环 DFS +回溯

清华大佬耗费三个月吐血整理的几百G的资源,免费分享!....>>>

#include<cstdio>
#include<cstring>
using namespace std;
int n;
int a[21];
int su[101];
 
int visit[200];
void DFS(int c)
{
    a[0]=1;// 初始为1
    if(c==n&&!su[a[0]+a[n-1]])//  如果 c==n  则结束     如果 第一个与最后一个和也为素数 则 输出
    {
        for(int i=0; i<n-1; i++)
            printf("%d ",a[i]);
        printf("%d",a[n-1]);
        printf("\n");
    }
    else
    {
        for(int i=2; i<=n; i++)
            if(!visit[i]&&!su[i+a[c-1]])//  如果  次数 与前一个数相加为素数 且没被拜访过 则  赋值
            {
                a[c]=i;
                //printf("%d   ",a[c]);
                visit[i]=1;//  标记
                DFS(c+1);//  继续查找下一行
                visit[i]=0;//回溯
            }
    }
}
 
int main()
{
    int t=1;
    for(int i=2; i<9; i++)
        for(int j=i*i; j<50; j+=i)
            su[j]=1;//赋值 1-50 内的非素数为1
    while(scanf("%d",&n)!=EOF)
    {
        printf("Case %d:\n",t++);
        memset(visit,0,sizeof(visit));
        DFS(1);
        printf("\n");
 
    }
    return 0;
}