AOJ 0041: Expression
適当にコードを短くしましょう。
数字の並べ方:4!通り
演算子のつけ方:3(種類) ^ 3(場所) 通り
括弧のつけ方:5(4)通り
で全部で9720(7776)通りなので、無駄が多いけど一瞬です。書くのは一瞬ではないですが、これで妥協しました。括弧のつけ方を1通り見落としてましたが、よく考えれば大丈夫です。
a - (b # (c # d)) != 10 (#は+-*のいづれか) が常に真なので、他のパターンのときに引っかかります。
#include <algorithm> #include <iostream> #include <string> #include <vector> using namespace std; vector<int> a(4); string s("+-*"); int f(int x,int y,int c){ switch(c){ case 0: return x + y; case 1: return x - y; case 2: return x * y; } } int main(){ while(cin>>a[0]>>a[1]>>a[2]>>a[3],a[0]||a[1]||a[2]||a[3]){ sort(a.begin(),a.end()); int flag = 1; do{ for(int i = 0; i < 3; i++){ for(int j = 0; j < 3; j++){ for(int k = 0; k < 3; k++){ if(f(f(f(a[0],a[1],i),a[2],j),a[3],k) == 10){ cout<<"(("<<a[0]<<" "<<s[i]<<" "<<a[1]<<")"<<" "<<s[j]<<" "<<a[2]<<")"<<" "<<s[k]<<" "<<a[3]<<endl; i = j = k = 3; flag = 0; break; } if(f(f(a[0],a[1],i),f(a[2],a[3],k),j) == 10){ cout<<"("<<a[0]<<" "<<s[i]<<" "<<a[1]<<") "<<s[j]<<" ("<<a[2]<<" "<<s[k]<<" "<<a[3]<<")"<<endl; i = j = k = 3; flag = 0; break; } if(f(f(a[0],f(a[1],a[2],j),i),a[3],k) == 10){ cout<<"("<<a[0]<<" "<<s[i]<<" ("<<a[1]<<" "<<s[j]<<" "<<a[2]<<")) "<<s[k]<<" "<<a[3]<<endl; i = j = k = 3; flag = 0; break; } if(f(a[0],f(f(a[1],a[2],j),a[3],k),i) == 10){ cout<<a[0]<<" "<<s[i]<<" (("<<a[1]<<" "<<s[j]<<" "<<a[2]<<") "<<s[k]<<" "<<a[3]<<")"<<endl; i = j = k = 3; flag = 0; break; } } } } }while(next_permutation(a.begin(),a.end()) && flag); if(flag) cout<<0<<endl; } return 0; }