您的位置:首页 > 其它

Cdoj 24点游戏之解题报告

2015-12-23 22:45 375 查看

24点游戏

Time Limit: 20 Sec
Memory Limit: 256 MB

题目连接

http://acm.uestc.edu.cn/#/problem/show/1252

Description

24点就是给你一串数字,问你是否通过加减乘除括号构成24点。

沈爷觉得这个很好玩,就决定考考你,给你4个数,可以交换位置,可以用加减乘除和括号,是否能构成24点呢?

注意哦~这里的除法并不是整数除法,比如样例

Input

第一行T,表示有多少组测试数据,1≤T≤50

接下来T行,每行4个正整数a1, a2, a3, a4,表示每个数都是多少,1≤ai≤13

Output

对于每一次询问,如果能够凑成24点,输出
yes
,否则输出
no


Sample Input

2
3 3 8 8
1 1 1 1

Sample Output

yes

no

对于这题笔者是看了大牛的正解之后才知道该如何用DFS(深搜)来解决这个问题;

下面就贴出代码吧:

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstdio>
using namespace std;

double value[4];

//对于此处的判断是否是24点,是实数而且考虑负数

bool DFS(int n)
{
if(n==1)
{    if(fabs(value[n-1]-24)<1e-6)  return true;
else                          return false;
}
else{
for(int i=0;i<n;++i)
for(int j=i+1;j<n;++j)
{  double x1 = value[i];
double x2 = value[j];
value[j] = value[n-1];    //将后面的数提到前面来,以便于后面的计算
value[i] = x1+x2; if(DFS(n-1))  return true;
value[i] = x1*x2; if(DFS(n-1))  return true;
value[i] = x1-x2; if(DFS(n-1))  return true;
value[i] = x2-x1; if(DFS(n-1))  return true;
if(x1){  value[i] = x2/x1; if(DFS(n-1)) return true; }
if(x2){  value[i] = x1/x2; if(DFS(n-1)) return true; }
//对于数value[j]没有满足条件,所以还原原来的数
value[i] = x1;
value[j] = x2;
}
}
//若n为数都不满足的话,就返回false
return false;
}

int main(void)
{
int T;
cin>>T;

while(T--)
{
cin>>value[0]>>value[1]>>value[2]>>value[3];
if(DFS(4))  cout<<"yes\n";
else        cout<<"no\n";
}

return 0;
}


如果你还没搞清楚状况的话可以点击一下下面的传送门:

(づ ̄3 ̄)づ╭❤~亲点我一下吧!





路漫漫其修远兮,吾将hold下去!



8÷(3–8÷3)对

对于这
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: