• HDU 1010 Prime Ring Problem


    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.

    思路就是简单的一个一个试,回溯即可。

    不过这题输出判定很恶心,注意末尾不能有多余的空格,否则会PE

    #include <iostream>
    #include <cmath>
    #include <algorithm>
    
    using namespace std;
    
    int prime[] = {3,5,7,11,13,17,19,23,29,31,33,37};
    bool isprime(int x){
      for (int i=0;i<12;i++){
        if (prime[i] == x){
          return true;
        }
      }
      return false;
    }
    int visited[100] = {0},res[100] = {0};
    int n;
    void tryit(int now){
      // for (int i=1;i<=n;i++){
      //   cout << res[i] << " ";
      // } cout << now << endl;
      if (now == n){
        if (!isprime(res[1] + res[now])) return;
        cout << 1;
        for (int i=2;i<=n;i++){
          cout << " " << res[i];
        }
        cout << endl;
        return ;
      }
      if (now == 0){
        res[1] = 1; visited[1] = 1;
        tryit(1);
        return;
      }
      int index = upper_bound(prime,prime+12,res[now]) - prime;
      for (int i=index;i<12 && prime[i] <= 2*n;i++){
        if (prime[i] <= res[now]) continue;
        int nownum = prime[i] - res[now];
        if (!visited[nownum] && nownum <= n){
          visited[nownum] = 1;
          res[now+1] = nownum;
          tryit(now+1);
          visited[nownum] = 0;
        }
      }
    
      return;
    }
    int main(){
      // freopen("test.in","r",stdin);
      // freopen("test.out","w",stdout);
      int total = 0;
      while (cin >> n){
        total ++;
        cout << "Case " << total << ":" << endl;
        tryit(0);
        cout << endl;
      }
      return 0;
    }
    View Code
  • 相关阅读:
    11.26
    11.25
    11.24
    11.23
    11.22
    11.21
    11.20
    3.16结对作业1.2
    3.14结对作业1.0
    3.13Android学习
  • 原文地址:https://www.cnblogs.com/ToTOrz/p/7336925.html
Copyright © 2020-2023  润新知