HDU 1016Presentation Error

这是一道典型的DFS题目。幻想有n个箱子,每次都向箱子里扔一个数,(当然第一个是必定是1,因为题目要求按字典序输出)。判断输出的条件就是,当我移动到第n+1个箱子的时候,就要return了,当然还要判断是否能输出。。怎么判断能否输出呢?题目说:组成一个圈子,a[j]+a[j+1]都必须是质数。但是,如果我们在n+1的时候再判断这个,已经很迟了,递归次数太多了。所以,应该是当满足这个条件,我才递归。

当然,a[1]+a[n]是需要在输出的时候判定的

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int n;
int book[30];
int a[30];
int prime[45];
int case_time;
void dfs(int step)
{
   if (step == n+1)//是否return
   {
	   if (prime[a[1]+a[n]])//判断是否能输出
	   {
		   int i;
		   for (i=1;i<n;i++)
		   {
			   //printf ("%d ",a[i]);  presensation error                           //注意这样输出会结尾的时候多一个空格
			   printf ("%d ",a[i]);
		   }
		   printf ("%d\n",a[n]);
	   }
	   return ;
   }
   else
   {
	   int i;
	   for (i=1;i<=n;i++)
	   {
		   if (book[i]==0&&prime[i+a[step-1]])
		   {
			   a[step]=i;
			   book[i]=1;
			   dfs(step+1);
			   book[i]=0;
		   }
	   }
	   return ;
   }
}
int main()
{
	prime[2]=1;
        prime[3]=1;
	prime[5]=1;
	prime[7]=1;
	prime[11]=1;
	prime[13]=1;
	prime[17]=1;
	prime[19]=1;

	//prime[21]=1;  21不是质数。。。原谅我error了
	prime[23]=1;
	prime[27]=1;
	prime[29]=1;
	prime[31]=1;
	prime[37]=1;
       //n<20  19+19 起码打到40的表
	while (scanf ("%d",&n)!=EOF)
	{
		case_time++;
		memset(book,0,sizeof(book));
		//printf ("Case %d:\n",case_time);
		printf("Case %d:\n",case_time);
		a[1]=1;
		book[1]=1;
		dfs(2);
		printf ("\n");
	}
	//system("pause");
	return 0;
}

 我觉得注意的就是多了一个空格那里,实在太坑

时间: 2024-12-09 22:00:44

HDU 1016Presentation Error的相关文章

HDU 3714 Error Curves

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3714 Error Curves Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 4536    Accepted Submission(s): 1721 Problem Description Josephina is a clever g

LA 5009 (HDU 3714) Error Curves (三分)

A - Error Curves Time Limit:3000MS    Memory Limit:0KB    64bit IO Format:%lld & %llu SubmitStatusPracticeUVALive 5009 Appoint description: Description Josephina is a clever girl and addicted to Machine Learning recently. She pays much attention to a

hdu 3714 Error Curves(三分)

Error Curves Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submission(s): 1198    Accepted Submission(s): 460 Problem Description Josephina is a clever girl and addicted to Machine Learning recently. She pa

HDU 3714 Error Curves(3分)

题意  求分段函数的最低点  每个点函数值为n个 a*x^2 + b*x +c (a>=0, |b|<5000, |c|<5000) 函数的最大值 由于a是不小于0的   所以此分段函数的函数图像只可能是类似'V'形的  可以画图观察出来  那么求最小值就可以用三分来解决了 #include <bits/stdc++.h> using namespace std; const int N = 10005; const double eps = 1e-9; int a[N],

算法笔记--三分查找

好菜啊,现在才学三分. 三分:查找凸形(凹形)函数的极大值(极小值). 模板1: double three_divide() { double l=0,r=1000; double mid=(l+r)/2; double mm=(l+mid)/2; while(r-l>=eps) { if(F(mid)>F(mm))r=mid; else l=mm; mid=(l+r)/2; mm=(l+mid)/2; } return F(mid); } 模板2: double three_divide()

Error Curves HDU - 3714

Josephina is a clever girl and addicted to Machine Learning recently. She pays much attention to a method called Linear Discriminant Analysis, which has many interesting properties. In order to test the algorithm's efficiency, she collects many datas

hdu 1348 Wall(凸包模板题)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1348 Wall Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3386    Accepted Submission(s): 968 Problem Description Once upon a time there was a gre

hdu 1541 Stars 解题报告

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1541 题目意思:有 N 颗星星,每颗星星都有各自的等级.给出每颗星星的坐标(x, y),它的等级由所有比它低层(或者同层)的或者在它左手边的星星数决定.计算出每个等级(0 ~ n-1)的星星各有多少颗. 我只能说,题目换了一下就不会变通了,泪~~~~ 星星的分布是不是很像树状数组呢~~~没错,就是树状数组题来滴! 按照题目输入,当前星星与后面的星星没有关系.所以只要把 x 之前的横坐标加起来就可以了

【DFS求树的最大二分匹配+输入外挂】HDU 6178 Monkeys

http://acm.hdu.edu.cn/showproblem.php?pid=6178 [题意] 给定一棵有n个结点的树,现在有k个猴子分布在k个结点上,我们可以删去树上的一些边,使得k个猴子每个猴子都至少和其他一个猴子相连 问树上最少保留多少条边 [思路] 每个猴子要至少和一个猴子相连,考虑保留的边最少,那么最优的情况一定是一条边的两个顶点放两个猴子,这些边的顶点都不重合 我们现在要找到给定的树中最多有多少条这样的边,即最大二分匹配 O(n)的DFS,对于每个结点,优先与叶子结点形成一条