zoukankan      html  css  js  c++  java
  • Prime Ring Problem(dfs水)

    题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1016

    Prime Ring Problem

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


    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
     
    Source
     简单的dfs
    直接上代码:
    这里介绍一个报错:Floating point exception (core dumped) linux下报这个一般就是出现了除0或者模0操作....写代码要仔细呀
     1 #include<cstdio>
     2 #include<cstring>
     3 using namespace std;
     4 #define N 50
     5 int a[N];
     6 bool vis[N];
     7 bool is_prime[N];
     8 void init()
     9 {
    10     for(int i =0 ;i < N ;i++) is_prime[i] = 1;
    11     for(int i =2  ;i < N ;i++)
    12     {
    13         for(int j = 2 ; j <= i/2 ;j++)
    14         {
    15             if(i%j==0) {is_prime[i] = 0 ; continue;}
    16         }
    17     }
    18 }
    19 void dfs(int n, int cnt)
    20 {
    21     if(cnt == n&&is_prime[a[0]+a[n-1]]) 
    22     {
    23         for(int i =0 ; i < n-1 ;i++)
    24         {
    25             printf("%d ",a[i]);
    26         }
    27         printf("%d
    ",a[n-1]);
    28     }
    29 
    30     for(int i = 1 ;i <= n ;i++)
    31     {
    32         if(!vis[i]&&is_prime[a[cnt-1]+i])
    33         {
    34             a[cnt] = i;
    35             vis[i] = 1;
    36             dfs(n,cnt+1);
    37             vis[i] = 0;
    38         }
    39     }
    40 }
    41 
    42 int main()
    43 {
    44     int n;
    45     int c = 0;
    46     init();
    47     while(~scanf("%d",&n))
    48     {
    49         printf("Case %d:
    ",++c);
    50         a[0] = 1;
    51         memset(vis,0,sizeof(vis));
    52         vis[1] = 1;
    53         dfs(n,1);
    54         puts("");
    55     }
    56     return 0;
    57 }
  • 相关阅读:
    cf D. Vessels
    cf C. Hamburgers
    zoj 3758 Singles' Day
    zoj 3777 Problem Arrangement
    zoj 3778 Talented Chef
    hdu 5087 Revenge of LIS II
    zoj 3785 What day is that day?
    zoj 3787 Access System
    判断给定图是否存在合法拓扑排序
    树-堆结构练习——合并果子之哈夫曼树
  • 原文地址:https://www.cnblogs.com/shanyr/p/4740307.html
Copyright © 2011-2022 走看看