• A


    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. 

     

    Inputn (0 < n < 20). 
    OutputThe 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 OutpuCase 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

    题目意思:
    给你一个20以内的正整数n,将1到n围成一个圈,每个数都和旁边数的和为素数
    输出所以可能的情况

    解法:普通的应用DFS的题目,注意跳出条件就可以了;

     1 #include <iostream>
     2 #include <string.h>
     3 using namespace std;
     4 
     5 const int  MAX = 100;
     6 int n;
     7 int visit[MAX];
     8 int Map[MAX];
     9 int a[MAX] = {3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61};
    10 
    11 void print()
    12 {
    13     for(int i = 1;i <=n;i++)
    14         if(i==1)
    15         cout<<Map[i];
    16         else
    17         cout<<" "<<Map[i];
    18     cout<<endl;
    19 }
    20 
    21 int pand(int x)
    22 {
    23     for(int i = 0;i<16;i++)
    24         if(x==a[i])
    25             return 1;
    26     return 0;
    27 }
    28 
    29 void dfs(int x,int ti)
    30 {
    31     if(ti==n)
    32     {
    33         if(pand(x+1))
    34         {
    35             print();
    36         }
    37     }
    38 
    39     for(int i = 2;i <= n;i++)
    40     {
    41         if(visit[i]==0 &&pand(i+x))
    42         {
    43             visit[i] = 1;
    44             Map[ti+1] = i;
    45             dfs(i,ti+1);
    46             visit[i] = 0;
    47         }
    48     }
    49 
    50 }
    51 
    52 int main()
    53 {
    54     int N=0;
    55     while(cin>>n)
    56     {
    57         cout<<"Case "<<++N<<":"<<endl;
    58         if(n==1)
    59         {
    60             cout<<1<<'
    '<<endl;
    61         continue;
    62         }
    63 
    64         memset(visit,0,sizeof(visit));
    65         visit[1] = 1;
    66         Map[1] = 1;
    67         dfs(1,1);
    68         cout<<endl;
    69 
    70     }
    71 
    72     return 0;
    73 }
    
    
    








  • 相关阅读:
    BZOJ2599: [IOI2011]Race(点分治)
    BZOJ4182: Shopping(点分治,树上背包)
    BZOJ3697: 采药人的路径(点分治)
    点分治
    BZOJ3091: 城市旅行(LCT,数学期望)
    BZOJ5020: [THUWC 2017]在美妙的数学王国中畅游(LCT,泰勒展开,二项式定理)
    BZOJ3514: Codechef MARCH14 GERALD07加强版(LCT,主席树)
    BZOJ4025: 二分图(LCT)
    BZOJ4817: [Sdoi2017]树点涂色(LCT)
    BZOJ2402: 陶陶的难题II(树链剖分,0/1分数规划,斜率优化Dp)
  • 原文地址:https://www.cnblogs.com/a2985812043/p/7258448.html
Copyright © 2020-2023  润新知