zoukankan      html  css  js  c++  java
  • HDOJ 1016 Prime Ring Problem (素数环问题)

    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
     
    #include <iostream>
    #include <cmath>
    #include <cstring>
    using namespace std;
    int sushu[50];
    int a[20],vis[20];
    
    int check(int n)
    {
    int t=sqrt(n);
    for(int i=2;i<=t;i++)  //小于等于开房数 
       { if(n%i==0) 
            return 0;
       }
    return 1;   
    }
    
    void dp(int m,int k)  //k相当于步骤 
    {
        if(k==m)          //k=m-1时也要算,加一 
          {
            if(sushu[a[m-1]+a[0]])
              {
                  cout<<1;
                for(int i=1;i<m;i++)
                      cout<<' '<<a[i];
                  cout<<endl;
              }    
            return;
          }
        for(int i=2;i<=m;i++)
           {
                 if(!vis[i]&&sushu[a[k-1]+i])
                    {
                    a[k]=i;
                    vis[i]=1;//三者顺序不能改
                    dp(m,k+1);
                    vis[i]=0; //不可放在括号外面 
                 }
              
           }
    }
    
    
    int main()
    {
    a[0]=1;
    memset(sushu,0,sizeof(sushu));
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=32;i++)
       {
           sushu[i]=check(i);
       }
    int n;
    int num=0;
    while(cin>>n)
        {
            num++;
            printf("Case %d:
    ",num);
            dp(n,1);
            cout<<endl;
        }
    return 0; 
    }
  • 相关阅读:
    poj3273Monthly Expense
    poj2516Minimum Cost
    poj1201Intervals(差分约束)
    poj3122Pie
    poj3258River Hopscotch
    hdu3308LCIS(线段树区间合并)
    CF1178F2 Long Colorful Strip
    CF906C Party
    [NOI2002]贪吃的九头龙
    CF1178F1 Short Colorful Strip
  • 原文地址:https://www.cnblogs.com/biggan/p/7457789.html
Copyright © 2011-2022 走看看