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; }