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