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

hdu 1016 Prime Ring Problem(DFS)

时间:2015-08-21 11:26:07      阅读:149      评论:0      收藏:0      [点我收藏+]

标签:

本题链接:点击打开链接

本题大意:

        输入一个数n表示需要查找的数有n个,并且这些数连成一个环,任意两个相邻的数之和都为素数。

解题思路:

        就是从1开始对每个点进行查找,符合条件的点就存到一个数组中,标记找过的点,查找完一次就进行输出,然后取消标记继续查找,直至将1~n中的点从小到大均查找一次。具体请参考代码:

#include<stdio.h>
#include<string.h>
int mark[22];
int num[22];
int prime_num[12]={2,3,5,7,11,13,17,19,23,29,31,37};
int n;
int is_prime(int a)
{
	for(int i=0;i<12;i++)
		if(a==prime_num[i])
			return 1;
	return 0;
}
void print_num()
{
	for(int i=1;i<n;i++)
		printf("%d ",num[i]);
	printf("%d\n",num[n]);
}
int dfs(int per,int post,int flag)//三个变量依次为此位置,与此位置相连的下一个位置,num数组中存放的位置 
{
	if(!is_prime(per+post))//若此位置与下一位置之和不是素数,则不满足条件,返回 
		return 0;
	num[flag]=post;//若满足条件,记下“下一个位置”到num数组中 
	if(flag==n&&is_prime(post+1))//若已查找到了n个数,并且第n个数与最先的位置1之和也为素数 
	{
		print_num();//则查找到一组,进行输出 
		return 1;//结束此次查找 
	}
	mark[post]=1;//若还没有查找完,则继续查找,将已经找过的点标记 
	for(int i=2;i<=n;i++)
		if(!mark[i]&&dfs(post,i,flag+1))
			break;
	mark[post]=0;//查找完一次后,可能还存在其他序列,所以取消标记,使后面可继续进行查找 
	return 0;
}
int main()
{
	int t=1;
	while(scanf("%d",&n)!=EOF)
	{
		for(int i=1;i<=n;i++)
		{
			mark[i]=0;//标记该数是否使用过 
		}
		num[1]=1;//存放序列,1肯定在 
		printf("Case %d:\n",t++);
		if(n==1)
			printf("1\n");
		for(int i=2;i<=n;i++)//首先查找1的下一位 
			dfs(1,i,2);//2表示i在num数组中存放的位置 
		printf("\n");
	}
	return 0;
}


版权声明:本文为博主原创文章,未经博主允许不得转载。

hdu 1016 Prime Ring Problem(DFS)

标签:

原文地址:http://blog.csdn.net/lsgbb/article/details/47830485

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