Particle

競技プログラミングについての雑記

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;
}