zoukankan      html  css  js  c++  java
  • 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.


    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 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<cstring>
    #include<cmath>
    using namespace std;
    int a[22],b[22],mark[22];
    int prime(int x)//判断是否是素数
    {
      int o=sqrt(x);
      if(x==1 || x==4) return 1;
      if(x==2 || x==3) return 0;
      for(int i=2;i<=o;i++)
      {
        if(x%i==0) return 1;
      }
      return 0;
    }
    void print(int n,int b[])//输出
    {
      for(int i=1;i<=n;i++)
      {
        if(i!=1) cout<<' ';
        cout<<b[i];
      }
      cout<<endl;
    }
    int judge(int front,int last,int k,int n)//递归判断素数环
    {
      if(prime(front+last)) return 0;
      b[k]=last;
      if(k==n && !prime(last+1))
      {
        print(n,b);
        return 1;
      }
      mark[last]=0;//标记是该数在子函数内不能在出现,但是回归主函数时必须释放
      for(int i=2;i<=n;i++)
      {
        if(mark[i] && judge(last,i,k+1,n)) break;
      }
      mark[last]=1;
      return 0;
    }
    int main()
    {
      int count=1,n;
      while(cin>>n)
      {
        for(int i=1;i<=n;i++)
        {
          mark[i]=1;
        }
        b[1]=1;
        cout<<"Case "<<count++<<":"<<endl;
        if(n==1) cout<<n<<endl;//1单独输出
        else {
          for(int i=2;i<=n;i++)
        {
          judge(1,i,2,n);
        }
        cout<<endl;
      }
    }
      return 0;
    }
    #include <iostream>
    #include <algorithm>
    #include<cmath>
    using namespace std;
    int a[30],vis[30];
    int prime(int x)
    {
      int o=sqrt(x);
      if(x==1 || x==4) return 1;
      if(x==2 || x==3) return 0;
      for(int i=2;i<=o;i++)
      {
        if(x%i==0) return 1;
      }
      return 0;
    }
    void dfs(int n,int m){
    
        if(n>m && prime(a[1]+a[m])==0){
            for(int i=1;i<=m;i++){
                if(i!=1) cout<<' ';
                cout<<a[i];
            }
            cout<<endl;
        }
        for(int i=2;i<=m;i++){
            if(vis[i]==0){
                a[n]=i;
                if(n==1 || (prime(i+a[n-1])==0)){
                        vis[i]=1;
                        dfs(n+1,m);
                        vis[i]=0;
                }
            }
        }
    }
    int main(){
        int n,count=1;
        while(cin>>n){
          cout<<"Case "<<count++<<":"<<endl;
        a[1]=1;
        vis[1]=1;
        dfs(2,n);
        cout<<endl;
      }
      return 0;
    }
     
  • 相关阅读:
    ‘随意’不是个好词,‘用心’才是
    servlet
    tomcat服务器
    http协议
    jdbc(Java数据库连接)
    dbcp和druid(数据库连接池)
    关于GitHub
    冒泡和递归
    python内置函数
    python四
  • 原文地址:https://www.cnblogs.com/shinianhuanniyijuhaojiubujian/p/6579661.html
Copyright © 2011-2022 走看看