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 ConsoleApplication1
{
    class SearchCombination
    {
        readonly char[] ope = new char[] { '+', '-', '*' };

        internal string result;

        int[] nums;
        int a, b, c, d;
        int x, y, z;

        public void Solve(int[] source)
        {
            for (int i = 0; i < 4; i++)
            {
                nums = (int[])source.Clone();

                Swap(0, i);
                a = nums[0];

                for (int j = 1; j < 4; j++)
                {
                    Swap(1, 2);
                    b = nums[1];
                    c = nums[2];
                    d = nums[3];

                    if (Search()) return;

                    if (c != d)
                    {
                        Swap(2, 3);

                        if (Search()) return;
                    }
                }
            }
        }

        private bool Search()
        {
            result = "0";

            int p = SearchPattern();

            if (p != -1)
            {
                result = MakeString(p);
                return true;
            }
            return false;
        }

        private void Swap(int n, int m)
        {
            int temp = nums[n];
            nums[n] = nums[m];
            nums[m] = temp;
        }

        private int SearchPattern()
        {
            for (x = 0; x < 3; x++)
                for (y = 0; y < 3; y++)
                    for (z = 0; z < 3; z++)
                    {
                        if (Calc(Calc(Calc(a, x, b), y, c), z, d) == 10) return 0;
                        if (Calc(Calc(a, x, Calc(b, y, c)), z, d) == 10) return 1;
                        if (Calc(Calc(a, x, b), y, Calc(c, z, d)) == 10) return 2;
                        if (Calc(a, x, Calc(Calc(b, y, c), z, d)) == 10) return 3;
                        if (Calc(a, x, Calc(b, y, Calc(c, z, d))) == 10) return 4;
                    }

            return -1;
        }

        private int Calc(int x, int type, int y)
        {
            switch (type)
            {
                case 0:
                    return x + y;
                case 1:
                    return x - y;
                case 2:
                    return x * y;
                default:
                    return 0;
            }
        }

        private string MakeString(int p)
        {
            switch (p)
            {
                case 0:
                    return string.Format("((({0} {1} {2}) {3} {4}) {5} {6})",
                        a, ope[x], b, ope[y], c, ope[z], d);
                case 1:
                    return string.Format("(({0} {1} ({2} {3} {4})) {5} {6})",
                        a, ope[x], b, ope[y], c, ope[z], d);
                case 2:
                    return string.Format("(({0} {1} {2}) {3} ({4} {5} {6}))",
                        a, ope[x], b, ope[y], c, ope[z], d);
                case 3:
                    return string.Format("({0} {1} (({2} {3} {4}) {5} {6}))",
                        a, ope[x], b, ope[y], c, ope[z], d);
                case 4:
                    return string.Format("({0} {1} ({2} {3} ({4} {5} {6})))",
                        a, ope[x], b, ope[y], c, ope[z], d);
                default:
                    return "0";
            }
        }
    }

    class Program
    {
        static void Main(string[] args)
        {
            StringBuilder sb = new StringBuilder();

            SearchCombination SC = new SearchCombination();

            while (true)
            {
                int[] input = Array.ConvertAll(Console.ReadLine().Split(' '), int.Parse);

                if (input[0] == 0) break;

                SC.Solve(input);

                sb.AppendLine(SC.result);
            }
            Console.Write(sb);
        }
    }
}