HDUOJ-1016 Prime Ring Problem(深搜)

深搜

依舊是DFS。。。

問題描述

一個環(huán)由5個圓組成。把自然數(shù) 1,2,...,n 分為單獨的圓,而相鄰的兩個圓的和要求是一個素數(shù)。

注意: 第一個圓總是1。(另:每組樣例輸出后有一個空行 + 每行數(shù)據(jù)的最后不要有空格)

解題結(jié)構(gòu)

素數(shù)

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

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

優(yōu)化

每層深搜都判斷一次,與上一個數(shù)的和是否為素數(shù)。
(一開始就沒有注意到這個問題,直接深到底然后判斷,然后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;
}

。(重要)總結(jié)教訓,不能死套模板,要靈活運用,以下為原版超時代碼
。
。

/*
* 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;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 在C語言中,五種基本數(shù)據(jù)類型存儲空間長度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來閱讀 4,081評論 0 2
  • 轉(zhuǎn)載自Matrix大牛一個數(shù)是素數(shù)(也叫質(zhì)數(shù)),當且僅當它的約數(shù)只有兩個——1和它本身。規(guī)定這兩個約數(shù)不能相同,因...
    Gitfan閱讀 2,176評論 0 1
  • 1007 素數(shù)對猜想 (20 分) 題目:讓我們定義d?n??為:d?n??=p?n+1???p?n??,其中p?...
    Celia_QAQ閱讀 786評論 0 0
  • 第六章 把信仰用于工作 我把孩子們送到學校,然后直接到了父親的住處。當我到達時,父親仍然睡得很熟。我踮起腳尖走進他...
    發(fā)現(xiàn)好物閱讀 264評論 0 0
  • 《請停止無效的社交》——一本通俗易懂的工具書!非常值得一看! 我一直相信,行為的改變是從觀念的改變開始的,深入透徹...
    此岸到彼岸閱讀 236評論 0 0

友情鏈接更多精彩內(nèi)容