zoukankan      html  css  js  c++  java
  • 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;
    } 
  • 相关阅读:
    安利博客
    python 的高阶算法之堆排序
    functools模块用途
    类型注解
    高阶函数和装饰器
    生成器

    递归函数
    匿名函数
    函数 的 返回值作用域
  • 原文地址:https://www.cnblogs.com/wisdom-jie/p/13780610.html
Copyright © 2011-2022 走看看