AOJ 0041

404 Not Found

超強引に解いた。かっこでくくるパターンを絞ってみたら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");
 }
}