24点游戏(Ⅰ)
程序员文章站
2022-03-30 08:26:58
...
激动hhhhh
#include<bits/stdc++.h>
using namespace std;
string s;
int flag,f,k;
stack<int>q;
int a[105];
typedef struct nod
{
int data;
int fenmu;
}nod;
typedef struct node
{
int data;
struct node *lc,*rc;
} node,*link;
void creat(link &L)
{
cin>>s;
int p=0;
if(s[0]=='#') L=NULL;
else
{
if(s[0]=='+') p=-1;
else if(s[0]=='-') p=-2;
else if(s[0]=='*') p=-3;
else if(s[0]=='/') p=-4;
else
{
int n=s.size(),i=0;
while(i<n) p=p*10+(s[i]-'0'),i++;
}
L=new node;
L->data=p;
creat(L->lc);
creat(L->rc);
}
}
void printt(link L)
{
if(L)
{
if(L->data>=0) printf("%d",L->data);
else
{
printf("(");
printt(L->lc);
if(L->data==-1) printf("+");
else if(L->data==-2) printf("-");
else if(L->data==-3) printf("*");
else printf("/");
printt(L->rc);
printf(")");
}
}
}
void print(link L)
{
if(L)
{
print(L->lc);
print(L->rc);
if(L->data>=0) q.push(L->data);
else
{
if(q.empty())
{
flag=1;
return;
}
int x=q.top();
q.pop();
if(q.empty())
{
flag=1;
return;
}
int y=q.top();
q.pop();
if(L->data==-1) q.push(x+y);
else if(L->data==-2) q.push(y-x);
else if(L->data==-3) q.push(x*y);
else
{
f=1;
if(x==0)
{
flag=1;
return;
}
q.push(y/x);
}
}
}
}
void check(link L)
{
if(L)
{
check(L->lc);
check(L->rc);
a[k++]=L->data;
}
}
int main()
{
while(cin>>s)
{
link L;
int p=0;
if(s[0]=='+') p=-1;
else if(s[0]=='-') p=-2;
else if(s[0]=='*') p=-3;
else if(s[0]=='/') p=-4,f=1;
else
{
int n=s.size(),i=0;
while(i<n) p=p*10+(s[i]-'0'),i++;
}
L=new node;
L->data=p;
creat(L->lc);
creat(L->rc);
flag=0,f=0;
if(!f) print(L);
if(flag) printf("NO\n");
else if(!f)
{
//printf("%d\n",q.top());
if(q.top()!=24) printf("NO\n");
else
{
printt(L);
printf("=24\n");
}
}
else
{
k=0;
check(L);
stack<nod>Q;
nod tt,ttt,tttt;
//for(int i=0;i<k;i++) printf(" %d",a[i]);
//printf("\n");
for(int i=0;i<k;i++)
{
if(a[i]>=0)
{
tt.data=a[i];
tt.fenmu=1;
Q.push(tt);
}
else
{
tt=Q.top();
Q.pop();
ttt=Q.top();
Q.pop();
int com=(ttt.fenmu*tt.fenmu)/(__gcd(tt.fenmu,ttt.fenmu));
int p1=com/ttt.fenmu,p2=com/tt.fenmu;
if(a[i]==-1)
{
tttt.data=ttt.data*p1+(tt.data*p2);
tttt.fenmu=com;
com=__gcd(abs(tttt.data),abs(tttt.fenmu));
tttt.data/=com;
tttt.fenmu/=com;
Q.push(tttt);
//Q.push(tttt);
}
else if(a[i]==-2)
{
tttt.data=ttt.data*p1-(tt.data*p2);
tttt.fenmu=com;
com=__gcd(abs(tttt.data),abs(tttt.fenmu));
tttt.data/=com;
tttt.fenmu/=com;
Q.push(tttt);
//Q.push(tttt);
}
else if(a[i]==-3)
{
tttt.data=ttt.data*tt.data;
tttt.fenmu=ttt.fenmu*tt.fenmu;
com=__gcd(abs(tttt.data),abs(tttt.fenmu));
tttt.data/=com;
tttt.fenmu/=com;
Q.push(tttt);
//Q.push(tttt);
}
else
{
tttt.data=ttt.data*tt.fenmu;
tttt.fenmu=ttt.fenmu*tt.data;
com=__gcd(abs(tttt.data),abs(tttt.fenmu));
tttt.data/=com;
tttt.fenmu/=com;
Q.push(tttt);
}
}
}
tttt=Q.top();
//printf("%d %d\n",tttt.data,tttt.fenmu);
if(tttt.data%tttt.fenmu==0&&tttt.data/tttt.fenmu==24)
{
printt(L);
printf("=24\n");
}
else printf("NO\n");
}
while(!q.empty()) q.pop();
}
}
/*
4c4
- * 5 # # 5 # # / 8 # # 8 # #
/ 8 # # - 3 # # / 8 # # 3 # #
< NO
---
> ((5*5)-(4/3))=24
6d5
< (8/(3-(8/3)))=24
8c7,8
< ((4-(4/7))*7)=24
---
> NO
> NO
*/