zoukankan      html  css  js  c++  java
  • hdu 1016 Prime Ring Problem

    B - Prime Ring Problem
    Time Limit:2000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

    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
    #include<iostream>
    #include<stdio.h>
    using namespace std;
    bool flag[100]={false};
    int ans[25];
    int n;
    int vis[25]={0};
    int t;
    void dfs(int num)
    {
        if(num==n&&(flag[ans[0]+ans[num-1]]==0))
        {
            for(int i=0;i<n-1;i++)
                printf("%d ",ans[i]);
            printf("%d
    ",ans[n-1]);
        }
        else
        {
            if(num==n) return;
            for(int i=2;i<=n;i++)
            {
               // cout<<"i: "<<endl;
                if(!vis[i]&&(flag[ans[num-1]+i]==0))
                {
                    //cout<<"i: "<<i<<endl;
                    vis[i]=1;
                    ans[num]=i;
                    dfs(num+1);
                    vis[i]=0;
                }
            }
        }
    }
    int main()
    {
        ans[0]=1;
        for(int i=2;i<100;i++)
        {
            if(!flag[i])
            {
                 for(int j=i<<1;j<100;j+=i)
                    flag[j]=true;
            }
    
        }
         t=1;
       // for(int i=0;i<23;i++) cout<<flag[i]<<endl;
        while(~scanf("%d",&n))
        {
            for(int i=0;i<=n;i++) vis[i]=0;
    
            printf("Case %d:
    ",t++);
            dfs(1);
            printf("
    ");
        }
    
    }
    View Code
     
  • 相关阅读:
    Eclipse 远程调试
    大数据处理方法bloom filter
    sicily 1259 Sum of Consecutive Primes
    sicily 1240. Faulty Odometer
    sicily 1152 简单马周游 深度优先搜索及回溯算法
    sicily 1050 深度优先搜索解题
    sicily 1024 邻接矩阵与深度优先搜索解题
    sicily 1156 二叉树的遍历 前序遍历,递归,集合操作
    sicily 1443 队列基本操作
    sicily 1006 team rankings 枚举解题
  • 原文地址:https://www.cnblogs.com/superxuezhazha/p/5713588.html
Copyright © 2011-2022 走看看