• ZOJ 1457 E-Prime Ring Problem


    https://vjudge.net/contest/67836#problem/E

    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.

    Input

    n (0 < n < 20)

    Output

    The output format is shown as sample below. Each row represents a series of circle numbers in the ring beginning from 1 clockwisely and anticlockwisely. The order of numbers must satisfy the above requirements. Print solutions in lexicographical order.

    You are to write a program that completes above process.

    Print a blank line after each case.

    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

    时间复杂度:$O(n!)$

    题解:dfs 要先判断 N ,如果 N 是奇数的情况下不可能构成素数环,而且如果不先排除会报超时

    代码:

    #include <bits/stdc++.h>
    using namespace std;
    
    int N;
    int vis[30];
    int a[30];
    
    int prime(int x) {
        for(int i = 2; i * i <= x; i ++)
            if(x % i == 0)
                return 0;
        return 1;
    }
    
    void dfs(int step) {
        if(step == N + 1 && prime(a[1] + a[N])) {
            for(int i = 1; i <= N; i ++) {
                printf("%d", a[i]);
                printf("%s", i != N ? " " : "
    ");
            }
            return ;
        }
        for(int i = 2; i <= N; i ++) {
            if(vis[i] == 0) {
                if(prime(i + a[step - 1])) {
                    vis[i] = 1;
                    a[step] = i;
                    dfs(step + 1);
                    vis[i] = 0;
                }
            }
        }
        return ;
    }
    
    int main() {
        int cnt = 0;
        while(~scanf("%d", &N)) {
            memset(vis, 0, sizeof(vis));
            memset(a, 0, sizeof(a));
            printf("Case %d:
    ", ++cnt);
            if(N % 2) {
                printf("
    ");
                continue;
            }
            a[1] = 1;
            vis[1] = 1;
            dfs(2);
            printf("
    ");
        }
        return 0;
    }
    

      

  • 相关阅读:
    PL/SQL跨库查询数据
    oracle 两个时间相减
    导出Excel格式数据
    Java导出pdf文件数据
    $.ajax相关用法
    oracle 删除掉重复数据只保留一条
    常用Oracle操作语句
    JS请求服务器,并返回信息,请求过程中不需要跳转页面
    tomcat部署web项目的3中方法
    Date()日期转换和简单计算
  • 原文地址:https://www.cnblogs.com/zlrrrr/p/9529043.html
Copyright © 2020-2023  润新知