nyoj 488素数环

素数环

时间限制: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

/*
    素数环:给定n,1~n组成一个素数环,相邻两个数的和为素数。
    首先偶数(2例外,但是本题不会出现两个数的和为2)不是素数,
     所以素数环里奇偶间隔。如果n是奇数,必定有两个奇数相邻的情况。
     所以当n为奇数时,输出“No Answer”。
     当n == 1时只1个数,算作自环,输出1
     所有n为偶数的情况都能变成奇偶间隔的环-----所以都有结果。
 */
#include<stdio.h>
#include<string.h>
 int prime[40];
 int visit[21];
 int a[21];
 void Is_prime()
 {
     int i,j;
     prime[0]=prime[1]=1;
     for(i=2;i<=6;++i)
         for(j=i*i;j<40;j+=i)
             prime[j]=1;
 }
 void DFS(int k,int n)
{
     int i;
     if(k==n+1&&prime[a[n]+a[1]]==0)
     {
         printf("1");
         for(i=2;i<=n;++i)
            printf(" %d",a[i]);
         printf("\n");
         return;
    }
     for(i=2;i<=n;++i)
     {
         if(!visit[i]&&!prime[i+a[k-1]])
         {
             visit[i]=1;
             a[k]=i;
             DFS(k+1,n);
             visit[i]=0;
         }
     }
 }

 int main()
 {
     int T,n;
     T=1;
     Is_prime();
     while(scanf("%d",&n),n)
     {
         printf("Case %d:\n",T++);
         if(n==1)
        {
             printf("1\n");
             continue;
         }
         if(n&1)
         {
             printf("No Answer\n");
             continue;
         }
         memset(visit,0,sizeof(visit));
         visit[1]=a[1]=1;
         DFS(2,n);
     }
     return 0;
 }

  

时间: 2024-08-02 18:24:39

nyoj 488素数环的相关文章

nyist 488 素数环

素数环 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简便起见,我们规定每个素数环都从1开始.例如,下图就是6的一个素数环. 输入 有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束. 输出 每组第一行输出对应的Case序号,从1开始. 如果存在满足题意叙述的素数环,从小到大输出. 否则输出No Answer. 样例输入 6 8 3 0 样

nyoj素数环(dfs)

素数环 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简便起见,我们规定每个素数环都从1开始.例如,下图就是6的一个素数环. 输入 有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束. 输出 每组第一行输出对应的Case序号,从1开始. 如果存在满足题意叙述的素数环,从小到大输出. 否则输出No Answer. 样例输入 6 8 3 0 样

nyoj 488 素数环(深搜)

素数环 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简便起见,我们规定每个素数环都从1开始.例如,下图就是6的一个素数环. 输入 有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束. 输出 每组第一行输出对应的Case序号,从1开始. 如果存在满足题意叙述的素数环,从小到大输出. 否则输出No Answer. 样例输入 6 8 3 0 样

NYOJ-488 素数环

素数环 时间限制:1000 ms  |  内存限制:65535 KB 难度:2 描述 有一个整数n,把从1到n的数字无重复的排列成环,且使每相邻两个数(包括首尾)的和都为素数,称为素数环. 为了简便起见,我们规定每个素数环都从1开始.例如,下图就是6的一个素数环. 输入 有多组测试数据,每组输入一个n(0<n<20),n=0表示输入结束. 输出 每组第一行输出对应的Case序号,从1开始. 如果存在满足题意叙述的素数环,从小到大输出. 否则输出No Answer. 样例输入 6 8 3 0 样

素数环

问题描述: 将从1到n这n个整数围成一个圆环,若其中任意2个相邻的数字相加,结果均为素数,那么这个环就成为素数环. n=20时,下面的序列就是一个素数环: 1 2 3 4 7 6 5 8 9 10 13 16 15 14 17 20 11 12 19 18 php版本回溯算法: 1 <?php 2 //素数环问题 3 include "show.php"; 4 5 define("LEN", 20); 6 7 class Primes 8 { 9 privat

回溯算法之素数环

using System; using System.Collections.Generic; using System.Linq; using System.Text; namespace SeqListSort { /// <summary> /// <ather> /// lihonglin /// </ather> /// <content> /// 把从1到20这20个数摆成一个环,要求相邻的两个数的和是一个素数. ///分析:用回溯算法,考察所有

HDU-1016【素数环】

题意:本题题意就是构成一个素数环.即相邻两数之和要为素数.环的元素个数在1到20之间. 素数-只能被1和它本身整除的数 输入6就是1-6排成一个相邻数相加是素数:环,第一个和最后一个加起来也要是素数 Sample Input 6 8 Sample Output 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 /*su shu huan*/

Prime Ring Problem 经典素数环

Prime Ring Problem A ring is compose of n circles as shown in diagram. Put natural number 1, 2, ..., n into each circle separately, and the sum of numbers in two adjacent circles should be a prime. Note: the number of first circle should always be 1.

ACM:回溯法,八皇后问题,素数环

(一)八皇后问题 (1)回溯法 #include <iostream> #include <string> #define MAXN 100 using namespace std; int tot = 0, n = 8; int C[MAXN]; void search(int cur) { if(cur == n) ++tot; //递归边界,只要走到了这里,所有皇后必然不冲突 else for(int i = 0; i < n; ++i) { int ok = 1; C