zoukankan      html  css  js  c++  java
  • NYOJ 素数环

    素数环

    时间限制:1000 ms  |  内存限制:65535 KB
    难度:2
     
    描述

    有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环。

    为了简便起见,我们规定每个素数环都从1开始。例如,下图就是6的一个素数环。

     
    输入
    有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束。
    输出
    每组第一行输出对应的Case序号,从1开始。
    如果存在满足题意叙述的素数环,从小到大输出。
    否则输出No Answer。
    样例输入
    6
    8
    3
    0
    样例输出
    Case 1:
    1 4 3 2 5 6
    1 6 5 2 3 4
    Case 2:
    1 2 3 8 5 6 7 4
    1 2 5 8 3 4 7 6
    1 4 7 6 5 8 3 2
    1 6 7 4 3 8 5 2
    Case 3:
    No Answer
    代码如下:
    #include <stdio.h> 
    #include <stdlib.h>
    #include <math.h>
    
    int primes[40] = {0};
    
    bool IsPrime(int n)
    {
        if (n == 2)
        {
            return true;
        }
        for (int i = 2; i <= sqrt((double)n) + 1; i++)
        {
            if (n % i == 0)
            {
                return false;
            }
        }
        return true;
    }
    
    void DFS(int n, int result[], int nresult, int visited[], int &b)
    {
        if (nresult >= 1 && !IsPrime(result[nresult - 1] + result[nresult % n]))
        {
            return;
        }
        if (nresult == n - 1)
        {
            if (!primes[result[nresult] + result[0]])
            {
                return;
            }
            for (int i = 0; i < n - 1; i++)
            {
                printf("%d ", result[i]);
            }
            printf("%d\n", result[n - 1]);
            ++b;
            return;
        }
        for (int i = 1; i < n; i++)
        {
            if (!visited[i])
            {
                visited[i] = 1;
                result[nresult + 1] = i + 1;
                DFS(n, result, nresult + 1, visited, b);
                visited[i] = 0;
            }
        }
    }
    
    
    int main()
    {
        int i;
        int ncount = 0;
        int visited[25];
        int n;
        int result[25];
        int b = 0;
        for (i = 3; i < 40; i++)
        {
            if (IsPrime(i))
            {
                primes[i] = 1;
            }
        }
        while(1)
        {
            scanf("%d", &n);
            if (0 == n)
            {
                break;
            }
            if (n == 1)
            {
                printf("Case %d:\n", ++ncount);
                printf("1\n");
                continue;
            }
            if (n % 2 == 1)
            {
                printf("Case %d:\n", ++ncount);
                printf("No Answer\n");
                continue;
            }
            result[0] = 1;
            for (i = 0; i <= n; i++)
            {
                visited[i] = 0;
            }
            visited[0] = 1;
            printf("Case %d:\n", ++ncount);
            b = 0;
            DFS(n, result, 0, visited, b);
            if (!b)
            {
                printf("No Answer\n");
            }
        }
        return 0;
    }
  • 相关阅读:
    纠结
    oracle大批量数据更新
    SQL Server 2008 “因为数据库正在使用,所以无法获得对数据库的独占访问权”解决方法
    面试总结
    Oracle 存储过程发送邮件
    ASP.NET页面之间传递值的几种方法<转>
    模式窗口里面,服务器控件添加确认操作时,又弹出新窗口
    深入研究Asp.net页面的生命周期<转>
    asp.net用jquery为服务器控件添加javascript处理
    sqlserver 把对象发布成webservice遇到的问题
  • 原文地址:https://www.cnblogs.com/lzmfywz/p/3055967.html
Copyright © 2011-2022 走看看