UVA524 素数环 Prime Ring Problem

   题目大意

    从1到n这n个数摆成一个环,要求相邻两个数的和是一个素数。

 题解

   一道简单的回溯题,递归填数,判断第i个数是否合法。如果合法,填数,判断是否n个已填满,如果填满且与第一位相加也是素数,输出结果,回溯;否则递归填下一个。

    此题中n较小,如果n较大可以使用欧拉筛提前筛出素数,n1查询。

#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
int n,a[25],tot;
bool v[25];
bool pd(int x)
{
    for(int i=2;i<=x-1;i++)
        if(x%i==0)return 1;
    return 0;
}
void dfs(int x)
{
    tot++;a[tot]=x;v[x]=1;
    if(tot==n)
    {
        if(!pd(1+a[n]))
        {
            for(int i=1;i<=n;i++)printf("%d ",a[i]);
            printf("
");
        }
        return ;
    }
    for(int i=2;i<=n;i++)
    {
        if(v[i]==1)continue;
        else
        {
            int ans=x+i;
            if(pd(ans))continue;
            else 
            {
                dfs(i);
                v[i]=0;a[tot]=0;tot--;
            }
        }
    }
}
int main()
{
    int t=0;
    while(scanf("%d",&n)!=EOF)
    {
        memset(v,0,sizeof(v));
        memset(a,0,sizeof(a));
        t++;
        printf("Case %d:
",t);
        tot=0;
        dfs(1);
        printf("
");
    }
    return 0;
} 
原文地址:https://www.cnblogs.com/wisdom-jie/p/13780610.html