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;
    }
    如果你够坚强够勇敢,你就能驾驭他们
  • 相关阅读:
    linux静态链接库
    查看进程运行时间
    进程间同步-互斥量
    Linux——多线程下解决生产消费者模型
    Linux——线程
    浅谈智能指针的历史包袱
    C++ 模板基础
    用信号量为共享内存添加同步机制
    Linux——浅析信号处理
    浅析fork()和底层实现
  • 原文地址:https://www.cnblogs.com/liuzhaojun/p/10762846.html
Copyright © 2011-2022 走看看