第三道深搜-----------hdu1016
简单深搜。每次对第step个位置进行测试,
for(i=2;i<=n;i++)
{
if(第i个点没有被访问过,并且和为质数)
result[step]=i; //则将这个数放入step的位置
visit[i]=1; //并且对第 i 个数进行标记,以后不再访问
dfs(step+1); //对下一个点按相同规则进行访问
}
我发现,深搜可以这样理解: 以某一个点为源点按确定的规则进行搜索。如果他的下一个邻接点可行(没有被访问过,且符合规则),则记录这个点,并标记。 然后,重新以该点为新的源点进行搜索。 如果不可行,则退回到上一步,继续按规则进行所示。 直到满足结束条件。
DFS即,每次一搜到底,不行就重新回溯。找一个方向或节点,再一搜到底。不行再回溯。
代码:
#include<stdio.h>
#include<string.h>
int result[20];
bool isprime[]={0,0,1,1,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,1,0,0,0,1,0,0,0,0,0,1,0,1,0,0,0,0,0,1,0};
bool visit[20];
int n;
void dfs(int step)
{
int i;
if(step==n+1)
{
if(isprime[result[n]+1]) //如果最后一个数(第n个数)和第一个数之和是质数
{
for(i=1;i<=n;i++)
{
if(i==n) printf("%d\n",result[i]);
else
printf("%d ",result[i]);
}
}
return ;
}
for(i=2;i<=n;i++)
{
if(!visit[i]&&isprime[i+result[step-1]])
{
result[step]=i;
visit[i]=1; //访问过就进行标记
dfs(step+1);
visit[i]=0;
}
}
}
int main()
{
int count=1;
while(scanf("%d",&n)!=EOF)
{
memset(visit,0,sizeof(visit));
result[1]=1;
printf("Case %d:\n",count++);
dfs(2);
printf("\n");
}
return 0;
}