天天看点

UVALive 6163 - Myth Busters

    状态压缩dp。

#include<algorithm>
#include<iostream>
#include<cstdlib>
#include<fstream>
#include<sstream>
#include<vector>
#include<string>
#include<bitset>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<set>
#define FF(i, a, b) for(int i=a; i<b; i++)
#define REP(i, n) for(int i=0; i<n; i++)
#define FD(i, a, b) for(int i=a; i>=b; i--)
#define CLR(a, b) memset(a, b, sizeof(a))
#define debug puts("**debug**")
#define PB push_back
#define LL long long

const int N = 11111;

using namespace std;

set <int> dp[17];
set <int> :: iterator lt;
set <int> :: iterator kt;

bool get(char tmp[])
{
    int i, j, k, l;
    i = 0;
    for(i = 0; i < 16; i ++) dp[i].clear();
    for(i = 0; i < 4; i ++)
    {
        dp[(1 << i)].insert(tmp[i] - '0');
    }
    for(i = 1; i < 16; i ++)
    {
        for(j = 1; j < i; j ++)
        {
            if((i & j) == j)
            {
                for(kt = dp[i-j].begin(); kt != dp[i-j].end(); kt++)
                {
                    for(lt = dp[j].begin(); lt != dp[j].end(); lt++)
                    {
                        k = *kt, l = *lt;
                        dp[i].insert(k + l);
                        dp[i].insert(k * l);
                        dp[i].insert(abs(l - k));
                        if(l) dp[i].insert(k / l);
                        if(k) dp[i].insert(l / k);
                    }
                }
            }
        }
    }
    return dp[15].count(10);
}
int main()
{
    //freopen("input.txt", "r", stdin);
    int n, i, j, flag;
    char tmp[6];
    while(cin >> n, n)
    {
        flag = 1;
        while(n --)
        {
            cin >> tmp;
            if(!get(tmp)) flag = 0;
        }
        if(flag) cout << "TRUE" << endl;
        else cout << "BUSTED" << endl;
    }
    return 0;
}