您的位置:首页 > 其它

搜索一·24点---dfs

2016-05-15 14:32 375 查看
时间限制:10000ms

单点时限:1000ms

内存限制:256MB

描述

周末,小Hi和小Ho都在家待着。

在收拾完房间时,小Ho偶然发现了一副扑克,于是两人考虑用这副扑克来打发时间。

小Ho:玩点什么好呢?

小Hi:两个人啊,不如来玩24点怎么样,不靠运气就靠实力的游戏。

小Ho:好啊,好啊。

<经过若干局游戏之后>

小Ho:小Hi,你说如果要写个程序来玩24点会不会很复杂啊?

小Hi:让我想想。

<过了几分钟>

小Hi:我知道了!其实很简单嘛。

提示:24点

输入

第1行:1个正整数, t,表示数据组数,2≤t≤100。

第2..t+1行:4个正整数, a,b,c,d,1≤a,b,c,d≤10。

输出

第1..t行:每行一个字符串,第i行表示第i组能否计算出24点。若能够输出”Yes”,否则输出”No”。

样例输入

2

5 5 5 1

9 9 9 9

样例输出

Yes

No

#include "iostream"
#include "algorithm"
#include "vector"
#include "fstream"
#include "string.h"
using namespace std;

int T;
double nowNum[4];
int ops[3];
double number[4];
int used[4];
//              +  -  *  /  反- 反/
int opType[] = {0, 1, 2, 3, 4, 5};
bool Oper(int depth);
double calType1();
double calType2();

bool Num(int depth)
{
if(depth >= 4)
{
return Oper(0);
}
for(int i=0; i<4; i++)
{
if(!used[i])
{
nowNum[depth] =  number[i];
used[i] = 1;
if(Num(depth+1))
return true;
used[i] = 0;
}
}
return false;
}

bool Oper(int depth)
{
if(depth >= 3)
{
if (abs(calType1()-24) < 1e-10)
return true;
if (abs(calType2()-24) < 1e-10)
return true;
return false;
}
for(int i=0; i<6; i++)
{
ops[depth] = opType[i];
if(Oper(depth+1))
return true;
}
return false;
}

//(c @ d) @ e @ f
double calType1()
{
double result = nowNum[0];
for(int i=1; i<4; i++)
{
if(ops[i-1] == 0)
result += nowNum[i];
else if(ops[i-1] == 1)
result -= nowNum[i];
else if(ops[i-1] == 2)
result *= nowNum[i];
else if(ops[i-1] == 3)
result /= nowNum[i];
else if(ops[i-1] == 4)
result = nowNum[i] - result;
else
if(result != 0)
result = nowNum[i] / result;
else
return 0;
}
return result;
}

//(c @ d) @ (e @ f)
double calType2()
{
double a[2];
int k = 0;
double result;
for(int i=0; i<3; i+=2)
{
if(ops[i] == 0)
a[k++] = nowNum[i] + nowNum[i+1];
else if(ops[i] == 1)
a[k++] = nowNum[i] - nowNum[i+1];
else if(ops[i] == 2)
a[k++] = nowNum[i] * nowNum[i+1];
else if(ops[i] == 3)
a[k++] = nowNum[i] / nowNum[i+1];
else if(ops[i] == 4)
a[k++] = nowNum[i+1] - nowNum[i];
else
a[k++] = nowNum[i+1] / nowNum[i];
}
if(ops[1] == 0)
result =  a[0] + a[1];
else if(ops[1] == 1)
result = a[0] - a[1];
else if(ops[1] == 2)
result = a[0] * a[1];
else if(ops[1] == 3)
if(a[1] != 0)
result = a[0] / a[1];
else
return 0;
else if(ops[1] == 4)
result = a[1] - a[0];
else
if(a[0] != 0)
result = a[1] / a[0];
else
return 0;
return result;
}

int main()
{
cin >> T;
while(T--)
{
for(int i=0; i<4; i++)
cin >> number[i];
memset(used, 0, sizeof(used));
if(Num(0))
cout << "Yes";
else
cout << "No";
cout << endl;
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: