深搜
依旧是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;
}
网友评论