深搜
依舊是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;
}