这道题会做到怀疑人生,好了废话不多说,我们发现这道题是一道深搜。但是字典序却不知道怎么排,我们发现没算一个运算符就会填加一个括号,所以我们用一个char变量贮储字典序最小的东西。
代码:
#include<cstring>
#include<cstdio>
typedef char String[20];
int a[4],b[4], ans[4][2];
String x[4],m,mina="zzzzz";
char op[4],data[4];
void print()
{
for(int i=0;i<4;i++)
{
sprintf(x[i],"%c",data[i]);//将原来数组记录一下
}
for(int i=0;i<3;i++)
{
sprintf(m,"(%s%c%s)",x[ans[i][0]],op[i],x[ans[i][1]]);//去找字典序最小的值
strcpy(x[ans[i][0]],m);//复制粘贴
}
if(strcmp(mina,x[ans[2][0]])>0)
{
strcpy(mina,x[ans[2][0]]);//比较
}
}
void dfs(int k)
{
if(k==3)
{
int i;
for(i=0;i<4;i++)
if(a[i]!= 0) break;//将a[i]数组的值存到a[3]里,方便判断
if(i<4&&a[i]==24)
{
print();
}
return;
}
for(int i=0;i<4;i++)
{
for(int j=0;j<4;j++)
{
if(i!=j&&a[j]!=0&&a[i]!=0)
{
int t1,t2;
//加操作
t1=a[i],t2=a[j];
a[i]=a[i]+a[j];a[j]=0;
ans[k][0]=i,ans[k][1]=j;//记录本次的加数
op[k]='+';//记录符号
dfs(k+1);//再搜一遍
a[i]=t1,a[j]=t2;
//减操作
t1=a[i];
t2=a[j];
a[i]=a[i]-a[j];
a[j]=0;
ans[k][0]=i;
ans[k][1]=j;
op[k]='-';//记录
dfs(k+1);
a[i]=t1;
a[j]=t2;
//乘
t1=a[i];
t2=a[j];
a[i]=a[i]*a[j];
a[j]=0;
ans[k][0]=i;
ans[k][1]=j;
op[k]='*';
dfs(k+1);
a[i]=t1;
a[j]=t2;
//判断会不会出现小数
if(a[i]%a[j]==0)
{
t1=a[i];
t2=a[j];
a[i]=a[i]/a[j];
a[j]=0;
ans[k][0]=i;
ans[k][1]=j;
op[k]='/';
dfs(k+1);
a[i]=t1;
a[j]=t2;
}
}
}
}
}
int main()
{
char hh;
memset(ans,-1,sizeof(ans));
for(int i=0;i<4;i++)
{
scanf("%c ", &hh);//我以为会出现A,T,J,Q,K。
data[i]=hh;
if(hh=='A') a[i]=1;
else if(hh=='T') a[i]=10;
else if(hh=='J') a[i]=11;
else if(hh=='Q') a[i]=12;
else if(hh=='K') a[i]=13;
else
{
a[i]=hh-'0';
}
}
memcpy(b,a,sizeof(a));//其实可以删掉。
dfs(0);//搜素
printf("%s\n", mina);//输出
return 0;
}
.....