zoukankan      html  css  js  c++  java
  • HDU1016 Prime Ring Problem(DFS回溯)

    Prime Ring Problem

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 34609    Accepted Submission(s): 15327


    Problem Description
    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
     

    这道题就是回溯暴力。 首先打出一个素数表, 然后DFS回溯判断即可。

    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    
    int is_prime(int x)
    {
        for(int i=2; i*i<=x; i++)
        if(x%i==0) return 0;
        return 1;
    }
    
    int n, A[50];
    bool isp[50], vis[50];
    void dfs(int cur)
    {
        if(cur==n&&isp[A[0]+A[n-1]])
        {
            for(int i=0; i<n-1; i++)
            {
                printf("%d ", A[i]);
            }
            printf("%d
    ", A[n-1]);
        }
        else for(int i=2; i<=n; i++)
        if(!vis[i]&&isp[i+A[cur-1]])
        {
            A[cur] = i;
            vis[i] = 1;
            dfs(cur+1);
            vis[i]=0;
        }
    }
    
    int main()
    {
        int kase = 0;
        while(scanf("%d", &n)!=EOF)
        {
            printf("Case %d:
    ", ++kase);
            for(int i=2; i<=n*2; i++)
            isp[i] = is_prime(i);
            memset(vis, 0, sizeof(vis));
            A[0] = 1;
            dfs(1);
            printf("
    ");
        }  
        return 0;
    }

     

     
  • 相关阅读:
    开发mis系统的技术
    Navicat软件与pymysql模块
    5.6作业
    mysql表的查询
    5.5作业
    约束条件
    mysql基本数据类型
    数据库
    网络编程项目
    并发编程四
  • 原文地址:https://www.cnblogs.com/acm1314/p/4746979.html
Copyright © 2011-2022 走看看