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.Arrays;
import java.util.Scanner;

public class Main {
	static int[] p;

	static int[] d;

	static int e[];

	static int a(int a, int b, int e) {
		switch (e) {
		case 0:
			return a + b;
		case 1:
			return a - b;
		case 2:
			return a * b;
		}
		return 0;
	}

	static String s(int e) {
		switch (e) {
		case 0:
			return " + ";
		case 1:
			return " - ";
		case 2:
			return " * ";
		}
		return "";
	}

	static int so(int depth) {
		if (depth == 4)
			return so2(0);
		for (int i = 0; i < 4; i++) {
			if (d[i] >= 0)
				continue;
			d[i] = depth;
			if (so(depth + 1) > 0)
				return 1;
			d[i] = -1;
		}
		return 0;
	}

	static int so2(int depth) {
		if (depth == 3)
			return ((calc() == 10 || calc2() == 10) ? 1 : 0);
		for (int i = 0; i < 3; i++) {
			e[depth] = i;
			if (so2(depth + 1) > 0)
				return 1;
		}
		return 0;
	}

	static int calc() {
		int[] t = new int[4];
		for (int i = 0; i < 4; i++)
			t[d[i]] = p[i];
		int s = t[0];
		for (int i = 0; i < 3; i++)
			s = a(s, t[i + 1], e[i]);
		return s;
	}

	static int calc2() {
		int[] t = new int[4];
		for (int i = 0; i < 4; i++)
			t[d[i]] = p[i];
		return a(a(t[0], t[1], e[0]), a(t[2], t[3], e[2]), e[1]);
	}

	static String str() {
		StringBuffer sb = new StringBuffer();
		int[] t = new int[4];
		for (int i = 0; i < 4; i++)
			t[d[i]] = p[i];
		sb.append("(((" + t[0]);
		for (int i = 0; i < 3; i++) {
			sb.append(s(e[i]) + t[i + 1] + ")");
		}
		return sb.toString();
	}

	static String str2() {
		int[] t = new int[4];
		for (int i = 0; i < 4; i++)
			t[d[i]] = p[i];
		return "(" + t[0] + s(e[0]) + t[1] + ")" + s(e[1]) + "(" + t[2] + s(e[2]) + t[3] + ")";
	}

	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		p = new int[4];
		d = new int[4];
		e = new int[3];
		while (sc.hasNextInt()) {
			for (int i = 0; i < 4; i++)
				p[i] = sc.nextInt();
			if (p[0] == 0 && p[1] == 0 && p[2] == 0 && p[3] == 0)
				break;
			Arrays.fill(d, -1);
			if (so(0) > 0) {
				if (calc2() == 10) {
					System.out.println(str2());
				} else {
					System.out.println(str());
				}
			} else {

				System.out.println(0);
			}
		}
	}
}