zoj 1204 Additive equations

ACCEPT

acm作业
因为老师是在集合那里要我们做这道题。所以我很是天真的就以为要用集合做,结果发现网上都是用数组简单明了地实现了,显得我的代码,特么地超级恶心!!!!!!!
在这里存档一下,别人就不要看了,ZOJ的格式也真是恶心。。。居然因为这个也弄了好久,应该只有我一个人用这么 没脑的集合方式做吧。。真的是哭瞎在厕所里!!!
//#include "stdafx.h"
#include"stdio.h"
#include"iostream"
#include<set>
using namespace std;
int tem[33] = { 0 };//存放加数 以便输出
int i = 0;
int flag = 0;
int c_sum=0;
void dfs(set<int> &c_iset, set<int>::iterator c_iterator, int de, int num)//num为加数个数
{
	set<int>::iterator set_iter1;
	if (num == 2)//两个加数时
	{

		for (set_iter1 = c_iterator, set_iter1++; *set_iter1 <*c_iset.rbegin(); set_iter1++)//set_iter1++,指向下一个、这里实现的是第二个加数
		{
			//c_sum = 0;
			tem[de] = *set_iter1;
			c_sum += tem[de];
// 			for (int k = 0; tem[k] != 0; k++)
// 			{
// 				c_sum = c_sum + tem[k];
// 			}
			if (c_iset.find(c_sum) != c_iset.end())//找到sum 成功可输出 
			{
				flag = 1;//成功标志
				printf("%d", tem[0]);
				for (int j = 1; tem[j] != 0; j++)
				{
					printf("+%d", tem[j]);
				}
				printf("=%d\n", c_sum);
	
			}
			if (c_sum >= *c_iset.rbegin())//结束,不必再继续递归下去
			{
				tem[de] = 0;//重置为0 ,已经输出过了
				return;
			}
			c_sum -= tem[de];
			//dfs(c_iset, set_iter1, de + 1);//到下一个数

		}
	}
	else
	{
		for (set_iter1 = c_iterator, set_iter1++; *set_iter1 <*c_iset.rbegin(); set_iter1++)//set_iter1++,指向下一个、这里实现的是第二个加数
		{
			tem[de] = *set_iter1;//减少一个数
			c_sum = 0;
			for (int k = 0; tem[k] != 0; k++)
			{
				c_sum = c_sum + tem[k];
			}
			if (c_sum > *c_iset.rbegin())//超过最后一个没有必要再进行下去了
			{
				tem[de] = 0;
				return;
			}
				
			num--;
			dfs(c_iset, set_iter1, de + 1, num);
			num++;
		}
	}
	tem[de] = 0;//重置为0
	return;
	};


	int main()
	{
		int n, m, l ;
		set<int>iset;
		set<int>::iterator set_iter;//
		scanf("%d", &n);//多少组
		while (n-- > 0)
		{
			scanf("%d", &m);//每组个数
			iset.clear();//清空
			for (int j = 0; j < m; j++)
			{
				scanf("%d", &l);
				iset.insert(l);

			}
			flag = 0;
		 
			for (int j = 2; j < m; j++)//加数个数从2到m-1个
			{
				for (set_iter = iset.begin(); *set_iter <* iset.rbegin(); set_iter++)//固定的第一个加数
				{

					c_sum = *set_iter;
					tem[0] = c_sum;
					i = 1;
					dfs(iset, set_iter, i,j);
				}
			}
			if (flag == 0)
			{
				printf("Can't find any equations.\n");
			}
			printf("\n");
		}
		return 0;
	}


下面的就不要看了,是第一次写错的结果大哭每次accept都 是历经千辛万苦!!隔了要两个月了吧
========================================================================================================================================================================================================================================================================
WRONG ANSWER

set 作为参数要引用&!

 

注意还原,调试非常好用!

虽然做出来一点意思了,但是不符合要求。。。顺序这个,是要考我们按层次递归么?太蠢了!

但是第一次按自己的意思写出了想要的递归,我舍不得删掉,要留着

t等我写出答案,再来。。。

 

#include "stdafx.h"
#include"stdio.h"
#include"iostream"
#include<set>
using namespace std;
int tem[33] = { 0 };//存放加数 以便输出
int i = 0;
int flag = 0;
void dfs(set<int> &c_iset, set<int>::iterator c_iterator, int de)
{
	set<int>::iterator set_iter1;
	for (set_iter1 = c_iterator, set_iter1++; set_iter1 != c_iset.end(); set_iter1++)//set_iter1++,指向下一个
	{
		int c_sum = 0;
		tem[de] = *set_iter1;
		for (int k = 0; tem[k] != 0; k++)
		{
			c_sum = c_sum + tem[k];
		}
		if (c_iset.find(c_sum) != c_iset.end())//找到sum 成功可输出 
		{
			flag = 1;//成功标志
			printf("%d", tem[0]);
			for (int j = 1; tem[j] != 0; j++)
			{
				printf("+%d", tem[j]);
			}
			printf("=%d\n", c_sum);
		}
		if (c_sum >= *c_iset.rbegin())//结束,不必再继续递归下去
		{
			tem[de] = 0;//重置为0
			return;
		}
		dfs(c_iset, set_iter1, de + 1);
	
	}
	tem[de] = 0;//重置为0
	return;
};


int main()
{
	int n, m, l, sum;
	set<int>iset;
	set<int>::iterator set_iter;//
	scanf("%d", &n);
	while (n-->0)
	{
		scanf("%d", &m);
		iset.clear();//清空
		while (m > 0)
		{
			scanf("%d", &l);
			iset.insert(l);
			m--;
		}
		flag = 0;
		for (set_iter = iset.begin(); set_iter != iset.end(); set_iter++)
		{

			sum = *set_iter;
			tem[0] = sum;
			i = 1;
			dfs(iset, set_iter, i);
		}
		if (flag==0)
		{
			cout << "Can't find any equations." << endl;
		}
	}
	return 0;
}


 

 

posted @ 2014-03-24 13:08  immoshi  阅读(203)  评论(0编辑  收藏  举报