题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1016
好久没有做关于深搜和广搜 的题目了,于是昨天一不小心被问到,于是便只能说所用的方法,具体实现过程便不知如何进行了;
于是回来之后便拾起之前的所学的东西,于是这便是第一个所攻下的题目:
本题理解起来容易,代码简单,适合作为理解深搜的典型题目:
说起深搜我的第一感觉便是用递归处理,广搜的第一反映便是用队列,果不其然,这题确实是通过递归处理的,详见代码:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h>
#include<string.h>
int prime[50];
int num[50];
int flag[50];
int N;
void DFS(int n)
{
int i,m=0;
if(n==N&&prime[1+num[n]]==1)
{
printf("1");
for(i=2;i<=N;i++)
{
printf(" %d",num[i]);
}
printf("\n");
m=1;
}
if(m==1)
return;
for(i=2;i<=N;i++)
{
if(flag[i]==0&&prime[i+num[n]]==1)
{
flag[i]=1;
num[n+1]=i;
DFS(n+1);
flag[i]=0;
}
}
}
int main()
{
int i,j;
prime[0]=prime[1]=0;
for(i=2;i<50;i++)
prime[i]=1;
for(i=2;i<=7;i++)
{
if(prime[i]==1)
{
for(j=i+i;j<50;j=j+i)
prime[j]=0;
}
}
int k=1;
while(scanf("%d",&N)!=EOF)
{
printf("Case %d:\n",k);
k++;
memset(num,0,sizeof(num));
memset(flag,0,sizeof(flag));
flag[1]=1;
num[1]=1;
DFS(1);
printf("\n");
}
return 0;
}