HDUOJ-1016 Prime Ring Problem(深搜)

深搜

依旧是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
#include
#include
#include
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)
    {
        printf("Case %d:\n",thisCase++);
        memset(book,0,sizeof(book));
        book[1]=1;
        outnum[0]=1;
        flag = 0;
        dfs(1);
        cout<

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

/*
* Created by zsdostar in 2016/5/2
*/
#include
#include
#include
#include
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>n)
    {
        printf("Case %d:\n",thisCase++);
        memset(book,0,sizeof(book));
        book[1]=1;
        outnum[0]=1;
        flag = 0;
        dfs(1);
        cout<

你可能感兴趣的:(HDUOJ-1016 Prime Ring Problem(深搜))