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: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AOJ
{
	class Program
	{
		static void Main(string[] args)
		{
			while (true)
			{
				int[] abcd = Console.ReadLine().Split(' ').Select(i => int.Parse(i)).ToArray();
				if (abcd.Sum() == 0) break;
				f(abcd);
			}
		}

		// ((a ? b) ? (c ? d))
		// (((a ? b) ? c) ? d)
		// ((a ? (b ? c)) ? d)

		static void f(int[] abcd)
		{
			string op = "+-*";
			bool flg = false;
			foreach (var p in GetPermutations(new[] { 0, 1, 2, 3 }))
			{
				for (int i = 0; i < 3; i++)
				{
					for (int j = 0; j < 3; j++)
					{
						for (int k = 0; k < 3; k++)
						{
							if (c(c(abcd[p[0]], abcd[p[1]], op[i]), c(abcd[p[2]], abcd[p[3]], op[j]), op[k]) == 10)
							{
								Console.WriteLine("(({0} {4} {1}) {6} ({2} {5} {3}))",
									abcd[p[0]], abcd[p[1]], abcd[p[2]], abcd[p[3]],
									op[i], op[j], op[k]);
								flg = true;
								return;
							}
							if (c(c(c(abcd[p[0]], abcd[p[1]], op[i]), abcd[p[2]], op[j]), abcd[p[3]], op[k]) == 10)
							{
								Console.WriteLine("((({0} {4} {1}) {5} {2}) {6} {3})",
									abcd[p[0]], abcd[p[1]], abcd[p[2]], abcd[p[3]],
									op[i], op[j], op[k]);
								flg = true;
								return;
							}
							if (c(c(abcd[p[0]], c(abcd[p[1]], abcd[p[2]], op[i]), op[j]), abcd[p[3]], op[k]) == 10)
							{
								Console.WriteLine("(({0} {5} ({1} {4} {2})) {6} {3})",
									abcd[p[0]], abcd[p[1]], abcd[p[2]], abcd[p[3]],
									op[i], op[j], op[k]);
								flg = true;
								return;
							}
						}
					}
				}
			}
			if (!flg)
				Console.WriteLine(0);
		}

		static int c(int n1, int n2, char op)
		{
			if (op == '+')
				return n1 + n2;
			else if (op == '-')
				return n1 - n2;
			else if (op == '*')
				return n1 * n2;
			return 0;
		}

		static IEnumerable<int[]> GetPermutations(int[] nums)
		{
			if (nums.Count() == 1)
			{
				yield return new int[1] { nums.First() };
			}
			else
			{
				foreach (var s in GetPermutations(nums.Skip(1).ToArray()))
				{
					for (int i = 0; i <= s.Count(); i++)
					{
						var tmp = s.ToList();
						tmp.Insert(i, nums.First());
						yield return tmp.ToArray();
					}
				}
			}
		}
	}
}