zoukankan      html  css  js  c++  java
  • XYNUOJ 2026 素数环

    题目描述

    有一个整数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

    //AC

    #include<cstdio>
    #include<cstring>
    using namespace std;
    int p[12]={2,3,5,7,11,13,17,19,23,29,31,37};
    int num[21],mark[21],n;
    int prime(int a)
    {
    for(int i=0;i<12;i++)
    if(a==p[i])return 1;
    return 0;
    }
    void print()
    {
    for(int i=1;i<n;i++)
    printf("%d ",num[i]);
    printf("%d ",num[n]);
    }
    int dfs(int x,int y,int z)
    {
    if(!prime(x+y))
    return 0;
    num[z]=y;
    if(z==n&&prime(y+1))
    {
    print();
    return 1;
    }
    mark[y]=0;
    for(int i=2;i<=n;i++)
    if(mark[i]!=0&&dfs(y,i,z+1))
    break;
    mark[y]=1;
    return 0;
    }
    int main()
    {
    int t;
    while(~scanf("%d",&n))
    {
    if(n==0)break;
    for(int i=1;i<=n;i++)
    mark[i]=1;
    num[1]=1;
    printf("Case %d: ",++t);
    if(n==1)
    {
    printf("1 ");
    continue;
    }
    else if(n%2!=0)
    {
    printf("No Answer ");
    continue;
    }
    for(int i=2;i<=n;i++)
    dfs(1,i,2);
    }
    return 0;
    }

  • 相关阅读:
    UVa-272-TEX Quotes
    UVa-10881-蚂蚁
    UVa-1339-古老的密码
    POJ-1328-放置雷达
    POJ-3190-分配畜栏
    Openjudge-2787-算24
    WHYZOJ-#47. 滑行的窗口(单调队列)
    2017年9月16日18:03:54
    WHYZOJ-#93. 暗黑破坏神(垃圾01背包)
    WHYZOJ-#95 大逃亡(二分+BFS)(好题!!!)
  • 原文地址:https://www.cnblogs.com/hys1258414454/p/7428456.html
Copyright © 2011-2022 走看看