AOJ0041

問題:Expression
なんか数字が4つ与えられるので演算子や()をつかって値が10になる式を出力する問題.
超頭が悪い事をしてしまった.黒歴史だけど記念に掲載.

あー頭わるい

#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <algorithm>

#define DEBUG(a) //cerr << #a << ":" << a << endl;

using namespace std;
//Table
const string symbol ="*+-";


//()の入っていない文字列を計算して結果を文字列で返す
string _calcStr(string in){
	DEBUG(in);
	string str = in;
	vector<int> svi,nvi;
	for(int i=1;i<str.size()-1;++i)
	{
		for(int j=0;j<3;++j)
		{
			if(str[i] == symbol[j])
			{
				svi.push_back(j);
				str[i] = ' ';
				if(str[i+1] == '-')
				{
					i++;
				}
				break;
			}
		}
	}
	stringstream ss;
	DEBUG(str);
	ss << str;
	int n;
	while(ss>>n)
	{
		nvi.push_back(n);		
	}
	for(int i=0;i<svi.size();++i)
	{
		if(svi[i]==0)
		{
			nvi[0] *= nvi[1];
			DEBUG(nvi[0]);
			nvi.erase(nvi.begin()+i+1);
			svi.erase(svi.begin()+i);
		}
	}
	while(nvi.size()!=1)
	{
		if(svi[0]==1)
			nvi[0] += nvi[1];
		if(svi[0]==2)
			nvi[0] -= nvi[1];
		nvi.erase(nvi.begin()+1);
		svi.erase(svi.begin());
	}

	ss.clear();
	str.clear();
	ss << nvi[0];
	ss >> str;
	DEBUG(str);
	return str;
}

//()の入っている文字列を計算して結果を文字列で返す
string calcStr(string in){
	int pnum;
	if( (pnum = count(in.begin(),in.end(),'(')) != count(in.begin(),in.end(),')') )
	{
		cerr << "error" << endl;
	}
	for(int i=0;i<pnum;++i){
		unsigned int from,to,num;
		to = in.find_first_of(')');
		from = in.substr(0,to).find_last_of('(');
		num = to - from ;
		string str = in.substr(from+1,num-1);
		in.erase(from,num +1);
		in.insert(from,calcStr(str));
	}
	return _calcStr(in);
}

vector<string> createStrComb(string in)
{
	vector<string> ret;
	string s;
	for(int i=0;i<in.size();++i)
	{
		if(in[i]>='0' && in[i]<='9')
		{
			s += in[i];
		}
	}

	sort(s.begin(),s.end());
	do{
		for(int i=0;i<3;++i)
		{
			for(int j=0;j<3;++j)
			{
				for(int k=0;k<3;++k)
				{
					char cstr[20];
					string created;
					sprintf(cstr,"((%c%c%c)%c%c)%c%c"
					,s[0],symbol[i],s[1],symbol[j],s[2],symbol[k],s[3]);
					created = cstr;
					ret.push_back(created);
					
					sprintf(cstr,"(%c%c(%c%c%c))%c%c"
					,s[0],symbol[i],s[1],symbol[j],s[2],symbol[k],s[3]);
					created = cstr;
					ret.push_back(created);
					
					sprintf(cstr,"%c%c(%c%c(%c%c%c))"
					,s[0],symbol[i],s[1],symbol[j],s[2],symbol[k],s[3]);
					created = cstr;
					ret.push_back(created);
					
					sprintf(cstr,"%c%c((%c%c%c)%c%c)"
					,s[0],symbol[i],s[1],symbol[j],s[2],symbol[k],s[3]);
					created = cstr;
					ret.push_back(created);
					
					sprintf(cstr,"(%c%c%c)%c(%c%c%c)"
					,s[0],symbol[i],s[1],symbol[j],s[2],symbol[k],s[3]);
					created = cstr;
					ret.push_back(created);
				}
			}
		}
	}while(next_permutation(s.begin(),s.end()));
	return ret;
}

int main()
{
	string in;
	while( getline(cin,in) )
	{
		if(in == "0 0 0 0")
		{
			break;
		}
		vector<string> vs = createStrComb(in);
		for(int i=0; i<vs.size(); ++i)
		{
			if(calcStr(vs[i]) == "10")
			{
				cout << vs[i] << endl;
				break;
			}
			else if(i==vs.size()-1)
			{
				cout << 0 << endl;
			}
		}
	}
	return 0;
}