zoukankan      html  css  js  c++  java
  • HDU-1016-素数环

    /*
    将1-n个数放在环中,保证相邻的两个数的和是素数
    第一个数字永远是1
    就这两个约束条件
    第一个难点是计算素数;
        参考文献:
        http://c.biancheng.net/cpp/html/2547.html
        http://blog.csdn.net/liukehua123/article/details/5482854
    
    第二个部分是深度递归;
        http://blog.csdn.net/a402630999/article/details/7208218
        http://www.cnblogs.com/jiangjing/archive/2013/02/04/2891621.html
    */
    
    #include <stdio.h>
    #include <stdlib.h>
    int n;
    int book[21],a[21];
    int isPrime[42];
    
    int get_prime()
    {    
        for(int i=2;i<8;i++)
        {
            if(!isPrime[i])
            {
                for(int j=i*i;j<42;j+=i)
                    isPrime[j]=1;
            }
        }
        return 0;
    }
    
    int dfs(int x)
    {
        if(x==n&&!isPrime[a[0]+a[n-1]])//最后一个已经放进去,并且最后一对首尾也满足条件
        {
            for(int i=0;i<x-1;i++)
                printf("%d ",a[i]);
            printf("%d
    ",a[x-1]);
            return 0;
    
        }
        for(int i=2;i<=n;i++)
        {
            if(book[i]==0&&!isPrime[a[x-1]+i])//没被使用,且上一个放进去的数和当前打算放进去的数的和是素数
            {
                a[x]=i;
                book[i]=1;
                dfs(x+1);
                book[i]=0;
            }
        }
        return 0;
    }
    int main()
    {
        //freopen("input.txt","r",stdin);
        int num=0;
        while(scanf("%d",&n)!=EOF)
        {
            num++;
            a[0]=1;
            get_prime();
            for(int i=0;i<21;i++)
                book[i]=0;
            printf("Case %d:
    ",num);
            dfs(1);
            printf("
    ");
        }
        return 0;
    }

    万事走心 精益求美


  • 相关阅读:
    50 系统调用的实现
    49 进程调度预备开发(下)
    48 进程调度预备开发(上)
    47 多进程并行执行(下)
    IIC总线
    46 多进程并行执行(上)
    45 内核中的中断处理(下)
    解决错误/usr/bin/ld: cannot find -lz
    rsync只传输隐藏文件
    Firewall命令
  • 原文地址:https://www.cnblogs.com/kongchung/p/6268349.html
Copyright © 2011-2022 走看看