第三道深搜-----------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;
}

posted on 2012-03-04 11:30  hrbust_09zhangyabin  阅读(190)  评论(0编辑  收藏  举报