• HUAS Summer Trainning #3 C


    Description

    Download as PDF
     

    A ring is composed of n (even number) circles as shown in diagram. Put natural numbers $1, 2, dots, 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 <= 16)

    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.

    You are to write a program that completes above process.

    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

    题目大意:使1~n这些数组成环,并且两两相加要是素数,输出所有的解。

    解题思路:第一个数总是1,直接用DFS从第二数开始遍历,遍历到底部不满足,回溯到上一个个节点,知道遍历完所有的可行解。

    代码:

     1 #include<iostream>
     2 #include<cstring>
     3 using namespace std;
     4 const int maxn=50+5;
     5 int a[maxn],b[maxn],d[maxn],n,i,j;
     6 int sushu(int x)
     7 {
     8     for(i=2;i*i<=x;i++)
     9         if(x%i==0)
    10             return 0;
    11     return 1;
    12 }
    13 void dfs(int cur)
    14 {
    15     if(cur==n&&d[a[0]+a[cur-1]])
    16     {
    17         cout<<a[0];
    18         for(int  i=1;i<n;i++)
    19             cout<<" "<<a[i];
    20         cout<<endl;
    21     }
    22     else
    23     {
    24         for(int i=2;i<=n;i++)
    25         {
    26             if(!b[i]&&d[i+a[cur-1]])
    27             {
    28                 a[cur]=i;
    29                 b[i]=1;
    30                 dfs(cur+1);
    31                 b[i]=0;
    32             }
    33         }
    34     }
    35 }
    36 int main()
    37 {
    38     int p=0,t=0;
    39     while(cin>>n&&n)
    40     {
    41         if(p++)
    42             cout<<endl;    
    43         cout<<"Case "<<++t<<":"<<endl;
    44     
    45       memset(a,0,sizeof(a));
    46       memset(d,0,sizeof(d));
    47       for(j=2;j<n*2;j++)
    48           d[j]=sushu(j);
    49       memset(b,0,sizeof(b));
    50       a[0]=1;
    51       dfs(1);
    52     }
    53     return 0;
    54 }
  • 相关阅读:
    ZOJ 3891 K-hash
    ZOJ 3890 Wumpus
    ZOJ 3888 Twelves Monkeys
    ZOJ 3885 The Exchange of Items
    HDU 3849 By Recognizing These Guys, We Find Social Networks Useful
    HDU 2242 考研路茫茫——空调教室
    BZOJ 3676: [Apio2014]回文串
    [转载]CAsyncSocket及CSocket注解
    WritePrivateProfileString()
    GetSystemMetrics()
  • 原文地址:https://www.cnblogs.com/huaxiangdehenji/p/4694190.html
Copyright © 2020-2023  润新知