码迷,mamicode.com
首页 > 其他好文 > 详细

hdu 1016 dfs素数环

时间:2014-12-09 23:11:12      阅读:360      评论:0      收藏:0      [点我收藏+]

标签:dfs

背景:周赛e题,当时很快就有人出,我能看出来是dfs但是却不能实现,哎以为自己能力不可写出,结果低估自己了。

学习:1.打了一个素数表,比较快捷,还有素数判别方法的函数,只需要枚举到该数的平方根即可,因为大于它的平方·根之后商都小于1,不可能再整除了。

int isPrime(int x)
{
	int i;
	for (i = 2; i <= sqrt(x*1.0); i++)//sqrt函数操作的是double。
	{
		if (x % i == 0) return 0;
	}
	return 1;
}
2.调了一个多小时尽然是又忘了回溯时下标也跟着减1!!!!!!!!

3.这里在检查一个数是否已经用过的时候,我用了每次都扫描已经用过的所有数的方法。其实可以建立一个数组visit[n],先memset(visit,1,sizeof(visit));没用过一个数k,就把visit[k]=0;这样就可以避免重复检测了。

4.调试的时候出现了把函数名定义为关键字的低级错误。调试发现h,每调试一步就会自增1,这一定是逻辑错误,结果发现没有回溯下标。

我代码:

#include<stdio.h>
int prime[12]={2,3,5,7,11,13,17,19,23,29,31,37};//素数表
int n,str[21]={1},h;
bool isprime(int a,int b);//输入a[n]和a[n-1],如果看a[n]是否满足和为素数且前面没有出现过的要求。
void makes(void);
  void makes(void)
  {
  	if(h==n)//如果已经有n个元素了,考虑它是否和第一个元素对接,若对接则输出。 
  	{
  		bool last=false;
  		int zz=str[0]+str[n-1];
  		for(int i=0;i<12;i++)
     	{
  	    	if(zz==prime[i]) last=true;
  	    }
  	    if(last)
  	    {
  	    	for(int ii=0;ii<n;ii++)
			{
				if(ii) printf(" ");
				printf("%d",str[ii]);
			}
			printf("\n");  
  	    }    
  	}
  	else
	{
	  	for(int i=2;i<=n;++i )
	  	{
	  		if(isprime(str[h-1],i))
	  		{
	  			str[h]=i;
	  			h++; 
	  			makes();
	  		}
	  	}
    }
    h--;  //注意注意注意!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! 
  } 
  bool isprime(int a,int b) 
  {
  	int z=a+b;
  	for(int i=0;i<12;i++)
  	{
  		if(z==prime[i]) goto l1;
  	}
  	return false;
l1: for(int k=0;k<h;k++)
    {
    	if(str[k]==b) return false;
    }
    return true;
  }
int main(void)
{
	int count=1;
	while(scanf("%d",&n)!=EOF&&n)
	{
		h=1;
		printf("Case %d:\n",count);
		count++;
		makes();
		printf("\n");
	}
	return 0;
}    



hdu 1016 dfs素数环

标签:dfs

原文地址:http://blog.csdn.net/jibancanyang/article/details/41830369

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!