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 JAVA (judge verdict: Accepted)

import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

//Expression
public class Main{

	static int[] a;
	static int[] order;
	static boolean[] used;
	static String s;

	static class E{
		public int x;
		public String e;
		public E(int x, String e) {
			this.x = x;
			this.e = e;
		}
	}

	static List<E> g(int[] a, int l, int r){
		List<E> result = new ArrayList<E>();
		if(r-l==0){
			result.add(new E(a[l], ""+a[l]));
			return result;
		}
		if(r-l==1){
			result.add(new E(a[l]+a[r], "("+a[l]+" + "+a[r]+")"));
			result.add(new E(a[l]-a[r], "("+a[l]+" - "+a[r]+")"));
			result.add(new E(a[l]*a[r], "("+a[l]+" * "+a[r]+")"));
			return result;
		}
		if(r-l==2){
			List<E> t = g(a, l+1, r);
			for(E e:t){
				result.add(new E(a[l]+e.x, "("+a[l]+" + "+e.e+")"));
				result.add(new E(a[l]-e.x, "("+a[l]+" - "+e.e+")"));
				result.add(new E(a[l]*e.x, "("+a[l]+" * "+e.e+")"));
			}
			t = g(a, l, r-1);
			for(E e:t){
				result.add(new E(e.x+a[r], "("+e.e+" + "+a[r]+")"));
				result.add(new E(e.x-a[r], "("+e.e+" - "+a[r]+")"));
				result.add(new E(e.x*a[r], "("+e.e+" * "+a[r]+")"));
			}
			return result;
		}
		for(int i=l;i<r;i++){
			List<E> t1 = g(a, l, i);
			List<E> t2 = g(a, i+1, r);
			for(E e1:t1){
				for(E e2:t2){
					result.add(new E(e1.x+e2.x, "("+e1.e+" + "+e2.e+")"));
					result.add(new E(e1.x-e2.x, "("+e1.e+" - "+e2.e+")"));
					result.add(new E(e1.x*e2.x, "("+e1.e+" * "+e2.e+")"));
				}
			}
		}
		return result;
	}

	static void f(int k){
		if(!s.equals(""))return;
		if(k==4){
			int[] t = new int[4];
			for(int i=0;i<4;i++)t[i]=a[order[i]];
			for(E e:g(t,0,3)){
				if(e.x==10){
					s = e.e;
					break;
				}
			}
			return;
		}
		for(int i=0;i<4;i++){
			if(!used[i]){
				used[i] = true;
				order[k] = i;
				f(k+1);
				used[i] = false;
			}
		}
	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(true){
			a = new int[4];
			for(int i=0;i<4;i++)a[i]=sc.nextInt();
			if((a[0]|a[1]|a[2]|a[3])==0)break;
			order = new int[4];
			used = new boolean[4];
			s = "";
			f(0);
			System.out.println(s.equals("")?"0":s);
		}
	}
}