关闭

Prime Ring Problem (DFS)

62人阅读 评论(0) 收藏 举报
分类:
  写完这题,对DFS有了更深的认识,来浅谈一下。
 
  一般看一个题目是不是DFS,就是看这道题是不是存在着有限的可能性。

  比如说这道题,先不考虑素数,当n=6的时候 1,2,3,4,5,6     1,3,2,4,6,5 都是一种可能性,并且还有其它若干个可能性。我们首先要解决的是怎么表示出所有的可能性,并且我们要让每个数只出现一次。这个时候我们可以画一个DFS树来方便理解。根据输出,我们知道,这个圆环以1为基点。depth表示深度,第一层有2,3,4三种可能,让我们联想到循环+递归模式。为了不让数字重复,我们需要设置一个exist数组,用过的数x让exist[x]=1,然后递归,判断数是否出现过,依此类推。当递归结束时,让用过的数变成没用过的。代码如下

void dfs(int depth)

 for(int i=2;i<=n;i++)
 {
  if (!exist[i])
  {
   num[depth]=i;
   exist[i]=1;  //表示数字i用过了
   dfs(depth+1);
   exist[i]=0;  //执行到这个语句,让这个数字变成没用过的。
  }
 }
 return ;
}

  然后就是把判断素数给加进去就OK了。要注意的是首尾两个数也要判断。
 
  int prime(int x)
{
 if (x==2)
 return 1;
 for(int i=2;i<=sqrt(x);i++)
 {
  if (x%i==0)
  return 0;
 }
 return 1;
}

 
if (depth==n)
 {
  for(int i=0;i<n;i++)
  {
   if (!prime(num[i]+num[(i+1)%n]))
   return ;
  }
  for(int i=0;i<n;i++)
  {
   if (i==0)
   printf("%d",num[i]);
   else
   printf(" %d",num[i]);
  }
  printf("\n");
  return ;
 }

  做搜索的key,画好搜索树,先完成部分代码,比如先列完可能性,测试,在按照题目要求加一些代码。
0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:619次
    • 积分:91
    • 等级:
    • 排名:千里之外
    • 原创:9篇
    • 转载:0篇
    • 译文:0篇
    • 评论:0条
    文章分类
    文章存档