AOJ 0041 Expression

数式 | Aizu Online Judge

順列を作るのが一番悩んだ(低能

#include <iostream>
#include <cstdio>
using namespace std;

#define FOR(i, a, b) for(int i = a; i < b; i++)
#define REP(a, b) FOR(a, 0, b)

char opr[3] = { '+','-','*' };

int calc(int a, int b, int c) {
	if (c == 0) return a + b;
	if (c == 1) return a - b;
	return a * b;
}

void permutations(int a, int b, int c, int d) {
	int per[4] = {0};
	REP(i, 4) { REP(j, 4) { REP(k, 4) { REP(l, 4) {
		if (k == i || k == j || i == j || 
			l == i || l == j || l == k) continue;
						
		per[i] = a;
		per[j] = b;
		per[k] = c;
		per[l] = d;

		REP(f, 3) { REP(g, 3) { REP(h, 3) {
			if (calc(calc(per[0], per[1], f), calc(per[2], per[3], h), g) == 10) {
				printf("((%d %c %d) %c (%d %c %d))\n",per[0], opr[f], per[1], opr[g], per[2], opr[h], per[3]);
				return;
			}

			if (calc(calc(calc(per[0], per[1], f), per[2], g), per[3], h) == 10) {
				printf("(((%d %c %d) %c %d) %c %d)\n", per[0], opr[f], per[1], opr[g], per[2], opr[h], per[3]);
				return;
			}
		} } }
	} } } }
	cout << 0 << endl;
}

int main() {
	int a, b, c, d;

	while (cin >> a >> b >> c >> d) {
		if (a == 0 && b == 0 && c == 0 && d == 0) break;

		permutations(a, b, c, d);
	}
	return 0;
}