超強引に解いた。かっこでくくるパターンを絞ってみたら5パターンしか無かった。
オペレータの順列生成で3倍無駄があるけど間に合う。擬似的に重複組み合わせ再現する。
#include <iostream> #include <vector> #include <algorithm> #include <cstdio> using namespace std; int ans(int x,int y,char op){ switch(op){ case '+': return x+y; case '-': return x-y; case '*': return x*y; } } int main(){ vector<int>n(4); vector<char>op(9); for(int i=0;i<9;i++){if(i<3)op[i]='+';else if(i<6)op[i]='-';else op[i]='*';}; int A,B; while(cin >> n[0] >> n[1] >> n[2] >> n[3] && n[0] || n[1] || n[2] || n[3]){ sort(n.begin(),n.end()); bool flag = false; do{ sort(op.begin(),op.end()); do{ /*パターン1*/ A = ans(n[0],n[1],op[0]); B = ans(A,n[2],op[1]); if( ans(B,n[3],op[2]) == 10){ printf("((%d %c %d) %c %d) %c %d\n",n[0],op[0],n[1],op[1],n[2],op[2],n[3]); flag = true; goto end; } /*パターン2*/ A = ans(n[1],n[2],op[1]); B = ans(n[0],A,op[0]); if( ans(B,n[3],op[2]) == 10){ printf("(%d %c (%d %c %d)) %c %d\n",n[0],op[0],n[1],op[1],n[2],op[2],n[3]); flag = true; goto end; } /*パターン3*/ A = ans(n[2],n[3],op[2]); B = ans(n[1],A,op[1]); if( ans(n[0],B,op[0]) == 10){ printf("%d %c (%d %c (%d %c %d))\n",n[0],op[0],n[1],op[1],n[2],op[2],n[3]); flag = true; goto end; } /*パターン4*/ A = ans(n[0],n[1],op[0]); B = ans(n[2],n[3],op[2]); if( ans(A,B,op[1]) == 10){ printf("(%d %c %d) %c (%d %c %d)\n",n[0],op[0],n[1],op[1],n[2],op[2],n[3]); flag = true; goto end; } /*パターン5*/ A = ans(n[1],n[2],op[1]); B = ans(A,n[3],op[2]); if( ans(n[0],B,op[0]) == 10){ printf("%d %c ((%d %c %d) %c %d)\n",n[0],op[0],n[1],op[1],n[2],op[2],n[3]); flag = true; goto end; } }while(next_permutation(op.begin(),op.end())); }while(next_permutation(n.begin(),n.end())); end: if(!flag)puts("0"); } }