题目传送门:https://www.luogu.org/problemnew/show/P1236
这个题dalao都是用后缀表达式做的,而我这种蒟蒻什么都不会只能强行爆搜失败。思路简单:假设输入的四个数为6 6 6 6,那么我们可以看出答案可以为6+6+6+6=24或6*6-6-6=24,那么无论如何式子都是由三个运算符号和四个数字组成的,那么在dfs(i)中我们根据i的奇偶来判断枚举的是什么(奇数位数字,偶数位运算符最后i==8时判断)。注意点:题目中要求+或*时两数若有大小先输大小(头脑发昏的我开始-和/都交换了位置),不要忘记了1 3 5 7,这种由两部分分别运算最后合起来的式子(3-1=2,7+5=12,12*2=24)。
那么最后来解释一下为什么说是伪题解,以下程序它本身非常神奇地无法处理输入的四个数中有重复的数且无解的情况(貌似是栈溢出了但我弄了两个小时也没弄好),直到我火了,我开始用一个sum1判断这个输入有无重复的数,再用sum规定在有重复的数(即sum1=1)有一个搜索底线(不太好用深度或广度来形容),简单的说,就是让它在栈溢出的边缘疯狂试探,搜索时不再死循环。以下为代码(这个300多行的代码令人神魂颠倒尽管很多是复制的):
#include<stdio.h>
#include<stdlib.h>
int a[100]={0},step1[100]={0},step2[100]={0},vis[1000]={0};
int flag=0,sum=0,sum1=0;
int judge1()
{
int i,ans;
ans=0;
for(i=1;i<=3;i++)
if(step2[i]==1)
{
if(i==1)
ans=step1[i]+step1[i+1];
else ans+=step1[i+1];
}
else if(step2[i]==2)
{
if(i==1)
ans=step1[i]-step1[i+1];
else ans-=step1[i+1];
}
else if(step2[i]==3)
{
if(i==1)
ans=step1[i]*step1[i+1];
else ans*=step1[i+1];
}
else if(step2[i]==4)
{
if(step1[i]%step1[i+1]!=0) return 0;
if(i==1)
ans=step1[i]/step1[i+1];
else ans/=step1[i+1];
}
if(ans==24)
return 1;
return 0;
}
int judge2()
{
int i,j,ans1=0,ans2=0;
if(step2[1]==1)
{
ans1=step1[1]+step1[2];
}
else if(step2[1]==2)
{
ans1=step1[1]-step1[2];
}
else if(step2[1]==3)
{
ans1=step1[1]*step1[2];
}
else if(step2[1]==4)
{
if(step1[1]%step1[2]!=0) return 0;
ans1=step1[1]/step1[2];
}
if(step2[3]==1)
{
ans2=step1[3]+step1[4];
}
else if(step2[3]==2)
{
ans2=step1[3]-step1[4];
}
else if(step2[3]==3)
{
ans2=step1[3]*step1[4];
}
else if(step2[3]==4)
{
if(step1[3]%step1[4]!=0) return 0;
ans2=step1[3]/step1[4];
}
if(step2[2]==1)
ans1=ans1+ans2;
else if(step2[2]==2)
ans1=ans1-ans2;
else if(step2[2]==3)
ans1=ans1*ans2;
else if(step2[2]==4)
{
if(ans1%ans2!=0)
return 0;
ans1=ans1/ans2;
}
if(ans1==24) return 1;
return 0;
}
int write1()
{
int i,j,ans=0,tmp;
if(step2[1]==1)
{
ans=step1[1]+step1[2];
if(step1[1]>step1[2])
printf("%d+%d=%d\n",step1[1],step1[2],ans);
else printf("%d+%d=%d\n",step1[2],step1[1],ans);
}
else if(step2[1]==2)
{
ans=step1[1]-step1[2];
if(step1[1]>step1[2])
printf("%d-%d=%d\n",step1[1],step1[2],ans);
else printf("%d-%d=%d\n",step1[2],step1[1],ans);
}
else if(step2[1]==3)
{
ans=step1[1]*step1[2];
if(step1[1]>step1[2])
printf("%d*%d=%d\n",step1[1],step1[2],ans);
else printf("%d*%d=%d\n",step1[2],step1[1],ans);
}
else if(step2[1]==4)
{
ans=step1[1]/step1[2];
if(step1[1]>step1[2])
printf("%d/%d=%d\n",step1[1],step1[2],ans);
else printf("%d/%d=%d\n",step1[2],step1[1],ans);
}
for(i=2;i<=3;i++)
if(step2[i]==1)
{
tmp=ans;
ans+=step1[i+1];
if(tmp>step1[i+1])
printf("%d+%d=%d\n",tmp,step1[i+1],ans);
else printf("%d+%d=%d\n",step1[i+1],tmp,ans);
}
else if(step2[i]==2)
{
tmp=ans;
ans-=step1[i+1];
printf("%d-%d=%d\n",tmp,step1[i+1],ans);
}
else if(step2[i]==3)
{
tmp=ans;
ans*=step1[i+1];
if(tmp>step1[i+1])
printf("%d*%d=%d\n",tmp,step1[i+1],ans);
else printf("%d*%d=%d\n",step1[i+1],tmp,ans);
}
else if(step2[i]==4)
{
tmp=ans;
ans/=step1[i+1];
printf("%d/%d=%d\n",tmp,step1[i+1],ans);
}
return 0;
}
int write2()
{
int i,ans1=0,ans2=0;
if(step2[1]==1)
{
ans1=step1[1]+step1[2];
if(step1[1]>step1[2])
printf("%d+%d=%d\n",step1[1],step1[2],ans1);
else printf("%d+%d=%d\n",step1[2],step1[1],ans1);
}
else if(step2[1]==2)
{
ans1=step1[1]-step1[2];
if(step1[1]>step1[2])
printf("%d-%d=%d\n",step1[1],step1[2],ans1);
else printf("%d-%d=%d\n",step1[2],step1[1],ans1);
}
else if(step2[1]==3)
{
ans1=step1[1]*step1[2];
if(step1[1]>step1[2])
printf("%d*%d=%d\n",step1[1],step1[2],ans1);
else printf("%d*%d=%d\n",step1[2],step1[1],ans1);
}
else if(step2[1]==4)
{
ans1=step1[1]/step1[2];
printf("%d/%d=%d\n",step1[1],step1[2],ans1);
}
if(step2[3]==1)
{
ans2=step1[3]+step1[4];
if(step1[3]>step1[4])
printf("%d+%d=%d\n",step1[3],step1[4],ans2);
else printf("%d+%d=%d\n",step1[4],step1[3],ans2);
}
else if(step2[3]==2)
{
ans2=step1[3]-step1[4];
printf("%d-%d=%d\n",step1[3],step1[4],ans2);
}
else if(step2[3]==3)
{
ans2=step1[3]*step1[4];
if(step1[3]>step1[4])
printf("%d*%d=%d\n",step1[3],step1[4],ans2);
else printf("%d*%d=%d\n",step1[4],step1[3],ans2);
}
else if(step2[3]==4)
{
ans2=step1[3]/step1[4];
printf("%d/%d=%d\n",step1[3],step1[4],ans2);
}
if(step2[2]==1)
{
if(ans1>ans2)
printf("%d+%d=24\n",ans1,ans2);
else printf("%d+%d=24\n",ans2,ans1);
}
else if(step2[2]==2)
{
if(ans1>ans2)
printf("%d-%d=24\n",ans1,ans2);
else printf("%d-%d=24\n",ans2,ans1);
}
else if(step2[2]==3)
{
if(ans1>ans2)
printf("%d*%d=24\n",ans1,ans2);
else printf("%d*%d=24\n",ans2,ans1);
}
else if(step2[2]==4)
{
if(ans1>ans2)
printf("%d/%d=24\n",ans1,ans2);
else printf("%d/%d=24\n",ans2,ans1);
}
return 0;
}
int dfs(int i)
{
int j;
sum++;
if(i==8)
{
if(judge1()==1)
{
flag=1;
write1();
}
return 0;
}
if(flag==1)
return 0;
if(sum>3700&&sum1==1) return 0;
if(sum>5000) return 0;
if(i%2==1)
{
for(j=1;j<=4;j++)
if(vis[j]==0)
{
step1[i/2+1]=a[j];
vis[j]=1;
dfs(i+1);
if(sum>3700&&sum1==1) return 0;
if(sum>5000) return 0;
step1[i/2+1]=0;
vis[j]=0;
}
}
else
{
for(j=1;j<=4;j++)
{
step2[i/2]=j;
dfs(i+1);
if(sum>3700&&sum1==1) return 0;
if(sum>5000) return 0;
step2[i/2]=0;
}
}
return 0;
}
int dfs2(int i)
{
int j;
sum++;
if(i==8)
{
if(judge2()==1)
{
flag=1;
write2();
}
return 0;
}
if(flag==1)
return 0;
if(sum>3700&&sum1==1) return 0;
if(sum>5000) return 0;
if(i%2==1)
{
for(j=1;j<=4;j++)
if(vis[j]==0)
{
step1[i/2+1]=a[j];
vis[j]=1;
dfs2(i+1);
if(sum>3700&&sum1==1) return 0;
if(sum>5000) return 0;
step1[i/2+1]=0;
vis[j]=0;
}
}
else
{
for(j=1;j<=4;j++)
{
step2[i/2]=j;
dfs2(i+1);
if(sum>3700&&sum1==1) return 0;
if(sum>5000) return 0;
step2[i/2]=0;
}
}
return 0;
}
int main()
{
int n,i;
for(i=1;i<=4;i++)
{
scanf("%d",&a[i]);
if(vis[a[i]]==0)
vis[a[i]]=1;
else sum1=1;
}
memset(vis,0,sizeof(vis));
dfs(1);
if(flag==0)
{
sum=0;
dfs2(1);
if(flag==0)
printf("No answer!");
}
return 0;
}