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: Wrong Answer)

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;

public class Main{
	static int NUM = 4;
	static int[][] numPatterns = new int[24][NUM];
	static int count = 0;
	static int answerIndex = -1;
	static char[] answerOpe = null;
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		String line = null;
		while ((line = br.readLine()) != null) {
			line = line.trim();
			if(line.equals("0 0 0 0")) break;
			
			String[] splited = line.trim().split(" ");

			int[] num = new int[NUM];
			for (int i = 0; i < NUM; i++) {
				num[i] = Integer.parseInt(splited[i]);
			}

			// 数値の組み合わせ
			numCombination(num, 0);
			//演算子の組み合わせ
			String answer = "0";
			for(int i = 0; i < 24; i++) {
				
				char[] ope = new char[NUM];
				opeCombination(i, 1, numPatterns[i][0], ope);
				
				if(answerIndex != -1) {
					answer = makeResult();
					break;
				}
			}
			
			System.out.println(answer);
			count = 0;
			answerIndex = -1;
			answerOpe = null;
		}
	}

	private static String makeResult() {
		String data = new String(Integer.toString(numPatterns[answerIndex][0]));
		if(answerOpe[0] == 'A') {
			data = String.format("(%d * %d) %c (%d * %d)", numPatterns[answerIndex][0],
					numPatterns[answerIndex][1],
					answerOpe[2],
					numPatterns[answerIndex][2],
					numPatterns[answerIndex][3]);
			return data;
		}
		for(int i = 1; i < NUM; i++) {
			if(answerOpe[i] == '*') {
				data = data + answerOpe[i] + numPatterns[answerIndex][i];
			} else {
				data = "(" + data + answerOpe[i] + numPatterns[answerIndex][i] + ")";
			}
		}
		return data;
	}


	private static void opeCombination(int pi, int index, int sum, char[] ope) {
		if(index > 3 || answerIndex != -1) {
			if(sum == 10) {
				answerIndex = pi;
				answerOpe = ope.clone();
			}
			return;
		}
		if(index == 1) {
			//(A * B) + or - (C * D) 
			ope[3] = '*';
			ope[1] = '*';
			
			ope[2] = '+';
			opeCombination(pi, 4, sum * numPatterns[pi][1] + numPatterns[pi][2] * numPatterns[pi][3], ope);
			ope[2] = '-';
			opeCombination(pi, 4, sum * numPatterns[pi][1] - numPatterns[pi][2] * numPatterns[pi][3], ope);
			
			//(A * B - C) * D　との区別
			if(answerIndex != -1)ope[0] = 'A';
		}
		ope[index] = '+';
		opeCombination(pi, index + 1, sum + numPatterns[pi][index], ope);
		ope[index] = '-';
		opeCombination(pi, index + 1, sum - numPatterns[pi][index], ope);
		ope[index] = '*';
		opeCombination(pi, index + 1, sum * numPatterns[pi][index], ope);
	}

	/*
	 * 数の組み合わせ一覧を作成する
	 * @param  num2 組み合わせる数値
	 * @param  length 組み合わせる箇所 
	 */
	private static void numCombination(int[] num2, int length) {
		int[] copy = num2.clone();
		if (length + 1 == NUM) {
			numPatterns[count] = copy;
			count++;
			return;
		}
		for (int i = length; i < NUM; i++) {
			if (i != length) {
				copy[length] ^= copy[i];
				copy[i] ^= copy[length];
				copy[length] ^= copy[i];
			}
			if (length + 1 < NUM)
				numCombination(copy, length + 1);
		}
	}
}