这个题看起来挺简单的,主要是练习搜索
一开始觉得一个个的选数就好,但是这样是错的,比如a×b-c×d这样的就没办法
在回溯的时候,[划掉][阿库娅附身][划掉]直接回溯成了输入的原数结果只拿了5分
#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stdio.h>
using namespace std;
int kill,f[5];
double num[5],copy1[5];
void dfs(int u)
{
int i,j;
if(kill==1) return;
if(u==4)
{
for(i=1;i<=4;i++)
if(f[i]==0)
if(fabs(num[i]-24.0)<=0.00000001)
{
kill=1;
printf("YES\n");
}
return;
}
for(i=1;i<=4;i++)
if(f[i]==0)
{
for(j=i+1;j<=4;j++)
if(f[j]==0)
{
f[j]=1;
double t1=num[i],t2=num[j];
num[i]=t1*t2;
dfs(u+1);
num[i]=t1+t2;
dfs(u+1);
num[i]=t1-t2;
dfs(u+1);
num[i]=t2-t1;
dfs(u+1);
num[i]=t1/t2;
dfs(u+1);
num[i]=t2/t1;
dfs(u+1);
f[j]=0;
num[i]=t1;
}
}
}
int main()
{
int i;
while(1)
{
memset(f,0,sizeof(f));
kill=0;
for(i=1;i<=4;i++)
{
scanf("%lf",&num[i]);
copy1[i]=num[i];
}
if((num[1]==0)&&(num[2]==0)&&(num[3]==0)&&(num[4]==0)) return 0;
dfs(1);
if(kill==0) printf("NO\n");
}
}