美文网首页
HDUOJ-1016 Prime Ring Problem(深搜

HDUOJ-1016 Prime Ring Problem(深搜

作者: 叽翅 | 来源:发表于2019-06-20 10:32 被阅读0次

    深搜

    依旧是DFS。。。

    问题描述

    一个环由5个圆组成。把自然数 1,2,...,n 分为单独的圆,而相邻的两个圆的和要求是一个素数。

    注意: 第一个圆总是1。(另:每组样例输出后有一个空行 + 每行数据的最后不要有空格)

    解题结构

    素数

    可以打表int prime[] = {2,3,5,7,11,13,17,19,23,29,31,37,41};
    或者按照定义“除了1和它本身以外,不能被任何整数整除的数”:

    bool judgePrime(int num)
    {
        for(int i=2;i*i<=num;i++)
             if(num%i==0)                                    
                 return false;
      return true;  
    } 
    

    优化

    每层深搜都判断一次,与上一个数的和是否为素数。
    (一开始就没有注意到这个问题,直接深到底然后判断,然后TLE。。)

    AcceptCode

    /*
    * Created by zsdostar in 2016/5/2
    */
    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    
    int n;
    int flag;
    int book[21];
    int outnum[21];
    int prime[] = {2,3,5,7,11,13,17,19,23,29,31,37,41};
    
    bool cmpPrime(int a)//true
    {
        for(int k=0;k<13;k++)
        {
          if(a==prime[k])
              return true;
        }
        return false;
    }
    void dfs(int step)
    {
        if(step==n)
        {
            if(cmpPrime( outnum[step-1]+outnum[0]) )
            {
                for(int i=0;i<n;i++)
                {
                    if(i!=0)  cout<<" ";
                    cout<<outnum[i];
                }
                cout<<endl;
            }
            return;
        }
        for(int i=1;i<=n;i++)
        {
            if(book[i]==0 && cmpPrime(outnum[step-1]+i))
            {
                book[i]=1;
                outnum[step]=i;
                dfs(step+1);
                book[i]=0;
            }
        }
    }
    
    int main()
    {
        int thisCase=1;
        while(cin>>n)
        {
            printf("Case %d:\n",thisCase++);
            memset(book,0,sizeof(book));
            book[1]=1;
            outnum[0]=1;
            flag = 0;
            dfs(1);
            cout<<endl;
        }
        return 0;
    }
    

    。(重要)总结教训,不能死套模板,要灵活运用,以下为原版超时代码

    /*
    * Created by zsdostar in 2016/5/2
    */
    #include<stdio.h>
    #include<iostream>
    #include<algorithm>
    #include<string.h>
    using namespace std;
    
    int n;
    int flag;
    int book[21];
    int outnum[21];
    int prime[] = {2,3,5,7,11,13,17,19,23,29,31,37,41};
    
    bool cmpPrime(int a)//true
    {
        for(int k=0;k<13;k++)
        {
          if(a==prime[k])
              return true;
        }
        return false;
    }
    bool compare(int step)
    {
        if(cmpPrime(outnum[0]+outnum[step-1]))
            for(int q=1;q<step;q++)
            {
                if(!(cmpPrime(outnum[q-1]+outnum[q]) ))
                    return false;
            }
        else
            return false;
        return true;
    }
    void dfs(int step)
    {
        if(step==n)
        {
            if(compare(step)==true )
            {
                for(int i=0;i<n;i++)
                {
                    if(i!=0) cout<<" ";
                    cout<<outnum[i];
                }
                cout<<endl;
            }
            return;
        }
        for(int i=1;i<=n;i++)
        {
            if(book[i]==0
            {
                book[i]=1;
                outnum[step]=i;
                dfs(step+1);
                book[i]=0;
            }
        }
    }
    
    int main()
    {
        int thisCase=1;
        while(cin>>n)
        {
            printf("Case %d:\n",thisCase++);
            memset(book,0,sizeof(book));
            book[1]=1;
            outnum[0]=1;
            flag = 0;
            dfs(1);
            cout<<endl;
        }
        return 0;
    }
    

    相关文章

      网友评论

          本文标题:HDUOJ-1016 Prime Ring Problem(深搜

          本文链接:https://www.haomeiwen.com/subject/flcdqctx.html