您的位置:首页 > 其它

ZSC oj 1538(DFS||暴力)

2015-11-22 15:28 459 查看


1538: 【2014GFL】C

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 54  Solved: 14

[Submit][Status][Web
Board]


Description

这是一道简单的小学生算术题,问题是这样的:给你四个整型数A,B,C,D,问其中的某一个数字能 否通过其他三个数的加减乘除运算得到。每个数只能用一次。如果可以,则输出Yes,否则输出 No。比如四个数为1,2,3,6.而1 + 2 + 3 = 6。所以输出Yes。如果四个数为2,2,3,9,则任意的三个数的运算,都不可能让等式成立。所以输出No。 提示:在计算机的整型数相除中,5 / 2 = 2,而我们 问题中的算术,5 / 2 = 2.5。能帮你的只有这么多了。


Input

第一行输入一个整数t,表示有t组测试数据。 每组数据,输入四个整数,A,B,C,D。其中0 <= A,B,C,D <= 1000.


Output

对于每组测试数据,按题意输出Yes或者No。


Sample Input

2

1 2 3 6

2 2 3 9


Sample Output

Yes

No


HINT


Source

题解:先用递归求出全排列,然后递归枚举所有情况,注意判断一下除以0的情况。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
#define N 50
double a
;
int vis
;
double pai

;
int q;
int judge;
#define eps 1e-4
void dfs_pai(int step,int pos)
{
if(step>4)
{
q++;
return ;
}
for(int i=1;i<=4;i++)
{
if(vis[i])continue;
pai[q][pos]=a[i];
vis[i]=1;
dfs_pai(step+1,pos+1);
vis[i]=0;
}
}

void dfs(int posi,int step,double answer)
{
if(judge)
return ;
if(step>3)
{
if(answer==pai[posi][4])
{
judge=1;
}
return;
}
for(int i=1;i<=4;i++)
{
if(i==1)dfs(posi,step+1,answer+pai[posi][step]);
if(i==2)dfs(posi,step+1,answer-pai[posi][step]);
if(i==3)dfs(posi,step+1,answer*pai[posi][step]);
if(i==4&&(pai[posi][step]!=0))dfs(posi,step+1,answer/pai[posi][step]);
}
}
int main()
{
#ifdef CDZSC
freopen("i.txt","r",stdin);
#endif
int t;
scanf("%d",&t);
while(t--)
{
judge=0;
q=0;
memset(pai,-1,sizeof(pai));
memset(vis,0,sizeof(vis));
for(int i=1;i<=4;i++)
scanf("%lf",&a[i]);
dfs_pai(1,1);
for(int i=1;i<=4;i++)
{
int tt;
for(int j=0;j<q;j++)
{
if(pai[j][i]>=0)tt=pai[j][i];
else
pai[j][i]=tt;
}
}
memset(vis,0,sizeof(vis));
for(int i=0;i<q;i++)
{
dfs(i,2,pai[i][1]);
if(judge)
{
break;
}
}
puts(judge?"Yes":"No");
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: