ZJU PAT 2-08 扑克牌 24点

暴力枚举表达式树,计算表达式值,输出表达式

#include <cstdio>
#include <string>
#include <cstring>
#include <ctime>
#include <cstdlib>
#include <queue>
#include <cmath>
#include <algorithm>
#include <functional>
#include <stack>
#include <set>
#include <vector>
#include <list>
#include <iostream>
using namespace std;
const double eps=1e-6;
char op[4]={'+','-','*','/'};
struct node
{
    int val,l,r;
    bool covered;
}tree[8];
double cal(int pos)
{
    if (tree[pos].val>=1&&tree[pos].val<=13)
        return tree[pos].val;
    double left=cal(tree[pos].l),right=cal(tree[pos].r);
    if (tree[pos].val=='+')
        return left+right;
    else if (tree[pos].val=='-')
        return left-right;
    else if (tree[pos].val=='*')
        return left*right;
    else
        return left/right;
}
bool create(int pos)
{
    for (int i=0;i<4;++i)
    {
        tree[pos].val=op[i];
        for (int l=1;l<pos;++l)
        {
            for (int r=1;r<pos;++r)
            {
                if (l!=r&&!tree[l].covered&&!tree[r].covered)
                {
                    tree[pos].l=l;
                    tree[pos].r=r;
                    tree[l].covered=true;
                    tree[r].covered=true;
                    if (pos==7)
                    {
                        if(fabs(cal(7)-24)<=eps)
                            return true;
                    }
                    else if (create(pos+1))
                        return true;
                    tree[l].covered=false;
                    tree[r].covered=false;
                }
            }
        }
    }
    return false;
}
string prt(int pos)
{
    if (tree[pos].val>=1&&tree[pos].val<=13)
    {
        char s[3];
        sprintf(s,"%d",tree[pos].val);
        return s;
    }
    char o=tree[pos].val;
    return "("+prt(tree[pos].l)+o+prt(tree[pos].r)+")";
}
int main()
{  
    int i;
    //while (true)
    {
        for (i=1;i<=4;++i)
        {
            scanf("%d",&tree[i].val);
            tree[i].covered=false;
        }
        tree[5].covered=false;
        tree[6].covered=false;
        if(create(5))
        {
            string s=prt(7);
            s=s.substr(1,s.length()-2);
            printf("%s",s.c_str());//没想到特判的那个渣程序,对于我在最外层加了括号判错,非得去了
        }
        else
            printf("-1");
        printf("\n");
    }
    
    return 0;
}

 

posted on 2013-12-18 19:54  Deller  阅读(185)  评论(0)    收藏  举报

导航