题目描述
在扑克牌的众多玩法中,算24是一种极有意义的玩法。玩家们从整副牌中随意抽出四张牌,然后用+、-、×、÷将这四张牌(每张牌必须被且只能被使用一次)上的点数组成一个算式(任意步骤结果都必须是整数),要求所得到的算式的结果为24。最快找出正确的算式的玩家胜出。现在请你用计算机编程用所给牌点算24(只要给出一个符合条件的算式即可)。
输入
共一行,包含四个用空格隔开的自然数(1~13),代表四张牌各自的牌点。
输出
有若干行,每行一个算式,代表运算的一个步骤(参与运算的两个数字大数在前小数在后,参考样例),若无解则输出“No Answer!”。
样例输入 Copy
1 2 4 4
样例输出 Copy
2+1=3
4+4=8
8*3=24
```cpp
#include<bits/stdc++.h>
#include<stdlib.h>
#define ll long long
using namespace std;
ll a[10],ans,l[5];
char test[4]={'+','-','*','/'};
bool w=0;
void dfs3(ll p1,char a,ll p2,char b,ll p3,char c,ll p4)
{
ll a1=p1,a2=p2,a3=p3,a4=p4,q=0,e=0;
char ae=a,br=b,cs=c;
ll s=0;
if(a=='+')
{
s=p1+p2; a='0';q=s;
}
if(a=='-')
{
s=p1-p2; a='0';q=s;
}
if(a=='*')
{
s=p1*p2; a='0';q=s;
}
if(a=='/'&&p1%p2==0)
{
s=p1/p2; a='0';q=s;
}
if(b=='+')
{
s=s+p3; b='0';e=s;
}
if(b=='-')
{
s=s-p3; b='0';e=s;
}
if(b=='*')
{
s=s*p3; b='0';e=s;
}
if(b=='/'&&s%p3==0)
{
s=s/p3; b='0';e=s;
}
if(c=='+')
{
s=s+p4; c='0';
}
if(c=='-')
{
s=s-p4; c='0';
}
if(c=='*')
{
s=s*p4; c='0';
}
if(c=='/'&&s%p4==0)
{
s=s/p4; c='0';
}
if(s==24&&a=='0'&&b=='0'&&c=='0')
{
cout<<p1<<ae<<p2<<"="<<q<<endl;
cout<<q<<br<<p3<<"="<<e<<endl;;
cout<<e<<cs<<p4<<"=24";
exit(0);
w=1;
}
}
void dfs2(ll p1,ll p2,ll p3,ll p4)
{
for(int i=0;i<=3;i++)
{
for(int j=0;j<=3;j++)
{
for(int k=0;k<=3;k++)
{
dfs3(p1,test[i],p2,test[j],p3,test[k],p4);
}
}
}
}
void dfs1(ll p1,ll p2,ll p3,ll p4)
{
dfs2(p1,p2,p3,p4);
dfs2(p1,p2,p4,p3);
dfs2(p1,p3,p2,p4);
dfs2(p1,p3,p4,p2);
dfs2(p1,p4,p2,p3);
dfs2(p1,p4,p3,p2);
dfs2(p2,p1,p3,p4);
dfs2(p2,p1,p4,p3);
dfs2(p2,p3,p1,p4);
dfs2(p2,p3,p4,p1);
dfs2(p2,p4,p1,p3);
dfs2(p2,p4,p3,p1);
dfs2(p3,p2,p1,p4);
dfs2(p3,p2,p4,p1);
dfs2(p3,p1,p2,p4);
dfs2(p3,p1,p4,p2);
dfs2(p3,p4,p2,p1);
dfs2(p3,p4,p1,p2);
dfs2(p4,p2,p3,p1);
dfs2(p4,p2,p1,p3);
dfs2(p4,p3,p2,p1);
dfs2(p4,p3,p1,p2);
dfs2(p4,p1,p2,p3);
dfs2(p4,p1,p3,p2);
}
int main()
{
cin>>a[1]>>a[2]>>a[3]>>a[4];
dfs1(a[1],a[2],a[3],a[4]);
cout<<"No Answer! ";
return 0;
}