zoukankan      html  css  js  c++  java
  • 素数环 dfs+回溯

    Prime Ring Problem

    Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
    Total Submission(s): 73040    Accepted Submission(s): 31109


    Problem Description
    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.
     
    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<stack>
    #include<queue>
    #include<cstring>
    #define maxn 1000
    using namespace std;
    int a[maxn]={0},b[maxn]={0};
    int check(int n,int m)
    {
        n=n+m;
        for(int i=2;i*i<=n;i++)
          {
               if(n%i==0)
               return false;
          }
          return true;
    }
    void dfs( int step,int n)
    {
        if(step>n)
        return ;
        if(step==n&&(check(a[n-1],a[0])))
        {
        for(int i=0;i<n;i++)
        {
            if(i!=n-1)
            cout<<a[i]<<" ";
            else
            cout<<a[i];
        }
        cout<<endl;
        }
        for(int i=2;i<=n;i++)
        {
          if(check(i,a[step-1])&&b[i]==0)    
          {
              a[step]=i;
              b[i]=1;
              dfs(step+1,n);
              b[i]=0;
          }
        }
    }
    int main()
    {
        int n,k=1;
        while(cin>>n)
        {
            memset(a,0,sizeof(a));
            memset(b,0,sizeof(b));
            a[0]=1;
            b[0]=1;
            cout<<"Case "<<k<<":"<<endl;
            dfs(1,n);
            cout<<endl;
            k++;
        }
        return 0;
    }
    如果你够坚强够勇敢,你就能驾驭他们
  • 相关阅读:
    再谈加密-RSA非对称加密的理解和使用
    WEB开发中的字符集和编码
    网页实时聊天之PHP实现websocket
    PHP中的回调函数和匿名函数
    shell实现SSH自动登陆
    初探PHP多进程
    PHP的openssl加密扩展使用小结
    搭建自己的PHP框架心得(三)
    docker 快速搭建Nexus3
    用图形数据库Neo4j 设计权限模块
  • 原文地址:https://www.cnblogs.com/liuzhaojun/p/10762846.html
Copyright © 2011-2022 走看看