Problem:
式

与えられた 4 つの 1 から 9 の整数を使って、答えが 10 になる式をつくります。
4 つの整数 a, b, c, d を入力したとき、下記の条件に従い、答えが 10 になる式を出力するプログラムを作成してください。また、答えが複数ある時は、最初に見つかった答えだけを出力するものとします。答えがない時は、0 と出力してください。

演算子として、加算 (+)、減算 (-)、乗算 (*) だけを使います。除算 (/) は使いません。使用できる演算子は３個です。

数を4つとも使わなければいけません。

4つの数の順番は自由に入れ換えてかまいません。

カッコを使ってもかまいません。使用できるカッコは３組（６個）以下です。

Input

複数のデータセットが与えられます。各データセットの形式は以下のとおり：

a b c d

入力は４つの 0 で終了します。データセットの数は 40 を超えません。

Output

各データセットについて、与えられた 4 つの整数と上記の演算記号およびカッコを組み合わせて値が 10 となる式または 0 を１行に出力してください。式の文字列が 1024 文字を超えてはいけません。

Sample Input

8 7 9 9
4 4 4 4
5 5 7 5
0 0 0 0

Output for the Sample Input

((9 * (9 - 7)) - 8)
0
((7 * 5) - (5 * 5))

Solution in C (judge verdict: Wrong Answer)

#include <stdio.h>
#include <stdlib.h>
#include <setjmp.h>
#include <string.h>
#define isNum(A) ('0'<=A && A<='9')
#define exch(A,B) {char t=postFix[A]; postFix[A]=postFix[B], postFix[B]=t;}
#define inFix (pp=N+M-1,parse())

#define GOAL 10
#define N 4
#define M N-1

jmp_buf buf;
char postFix[N+M];

// parse postFix and return infix-string
int pp;
char* parse(){
     char *t, *a, *b; char op;
	
     if(isNum(postFix[pp]))
	  t=malloc(1), sprintf(t,"%c",postFix[pp--]);

     else{
	  op = postFix[pp--];
	  a = parse(), b = parse();

	  t = malloc(strlen(a)+strlen(b)+3);
	  sprintf(t,"(%s%c%s)",a,op,b);

	  free(a), free(b);
     }

     return t;
}

// if evaluated-value==GOAL then jmp
void calc(){
     int i, sp=0; double s[N], t;

     for(i=0; i<N+M; i++){
	  if(isNum(postFix[i])) s[sp++]=postFix[i]-'0';
	  else{
	       if(sp<2) return; // stack overflow
	       switch(postFix[i]){
	       case '+': t= s[--sp] + s[--sp]; s[sp++]=t; break;
	       case '-': t= s[--sp] - s[--sp]; s[sp++]=t; break;
	       case '*': t= s[--sp] * s[--sp]; s[sp++]=t; break;
	       case '/': t= s[--sp] / s[--sp]; s[sp++]=t; break;
	       }
	  }
     }

     if(s[--sp]==GOAL) longjmp(buf,1);
}

// permutate postFix
void perm(int l){
     int i;
	
     if(l<N+M){
	  perm(l+1);

	  for(i=l+1; i<N+M; i++)
	       if(postFix[i]!=postFix[l]){
		    exch(i,l); perm(l+1); exch(i,l);
	       }
     }
     else calc();
}

// select operators
void solve(){
     int i, j, k, n;

     for(i=N; i<=N+M; i++)
	  for(j=i; j<=N+M; j++)
	       for(k=j; k<=N+M; k++){
		    for(n=N; n<N+M; n++) postFix[n]=n<i?'+':n<j?'-':n<k?'*':'/';
		    perm(0);
	       }
}

int main(void){
     int i; char *s;
     
     while(1){
	  for(i=0; i<N; i++) scanf("%c%*c",&postFix[i]);
	  if(postFix[0]=='0') return 0;
	  
	  if(setjmp(buf)==0)
	       solve(), puts("0");

	  else
	       puts(s=inFix), free(s);
     }
}