AOJ - Problem 0041 : Expression
1から9の整数a,b,c,dと演算子+,-,*を使って10になる式を探して出力する問題です。
4つの数字の並び替えが4!=24通り
3種類の演算子を3箇所につかうので3*3*3=27通り
括弧のつけかたは( (a+b)+(c+d))と(((a+b)+c)+d)と*1+d)の3通りを試しましたが通りました。ジャッジのしくみがよくわかりません。
全部で24*27*3で1944通り試しています。
#include <iostream> #include <vector> #include <algorithm> using namespace std; char o[3] = {'+','-','*'}; bool flag; int calc(int a,int b,int op){ if( op == 0 ) return a + b; if( op == 1 ) return a - b; return a * b; } void solve(vector<int> v, int op1, int op2, int op3){ if( flag == false ) return ; int a = v[0]; int b = v[1]; int c = v[2]; int d = v[3]; if( calc( calc( calc(a,b,op1) , c , op2 ) , d , op3 ) == 10 ){ cout << "(((" << a << " " << o[op1] << " " << b << ") " << o[op2] << " " << c << ") " << o[op3] << " " << d << ")" << endl; flag = false; return; } if( calc( calc(a,b,op1) , calc(c,d,op3) , op2 ) == 10 ){ cout << "((" << a << " " << o[op1] << " " << b << ") " << o[op2] << " (" << c << " " << o[op3] << " " << d << "))" << endl; flag = false; return; } if( calc( calc( a , calc(b,c,op2) , op1 ) , d , op3 ) == 10 ){ cout << "((" << a << " " << o[op1] << " (" << b << " " << o[op2] << " " << c << ") " << o[op3] << " " << d << "))" << endl; flag = false; return; } } int main(){ int a,b,c,d; while( cin >> a >> b >> c >> d , a || b || c || d ){ vector<int> v(4); flag = true; v[0] = a; v[1] = b; v[2] = c; v[3] = d; sort( v.begin() , v.end() ); do{ for(int i=0 ; i < 3 && flag ; i++ ){ for(int j=0 ; j < 3 && flag ; j++ ){ for(int k=0 ; k < 3 && flag ; k++ ){ solve( v , i , j , k ); } } } }while( next_permutation(v.begin(),v.end()) && flag ); if( flag ){ cout << 0 << endl; } } }
*1:a+(b+c