zoukankan      html  css  js  c++  java
  • hdu 1016 Prime Ring Problem(DFS)

    本题链接:点击打开链接

    本题大意:

            输入一个数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
    ",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:
    ",t++);
    		if(n==1)
    			printf("1
    ");
    		for(int i=2;i<=n;i++)//首先查找1的下一位 
    			dfs(1,i,2);//2表示i在num数组中存放的位置 
    		printf("
    ");
    	}
    	return 0;
    }


  • 相关阅读:
    Oracle数据库基础
    2016-08-08二期模拟考试
    易买网-登入
    常量接口模式
    反射
    Hhibernate延迟加载
    URL和URI的区别和联系
    Socket编程
    ArrayList如何实现线程安全
    移位运算符
  • 原文地址:https://www.cnblogs.com/yangykaifa/p/6872098.html
Copyright © 2011-2022 走看看