zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    new Date(str)返回 Invalid date问题
    时间倒计时
    js返回上一页并刷新 代码整理
    赋值变量值在标签里
    jQuery获取select选择的文本与值
    判断div里面的子集是否含有特定的类
    卷boot仅剩余XX空间
    ubuntu16.04 anaconda3安装
    ERROR 2003 (HY000): Can't connect to MySQL server on 'localhost' (10061)
    毕业设计
  • 原文地址:https://www.cnblogs.com/ToTOrz/p/7336925.html
Copyright © 2011-2022 走看看