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; }
浙公网安备 33010602011771号