UESTC - 1252 24点游戏 (DFS)好题

UESTC - 1252
24点游戏
Time Limit: 1000MS   Memory Limit: 65535KB   64bit IO Format: %lld & %llu

Submit Status

Description

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

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

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

Input

第一行 ,表示有多少组测试数据,

接下来 行,每行 个正整数 ,  ,  ,  ,表示每个数都是多少,

Output

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

Sample Input

2 
3 3 8 8 
1 1 1 1

Sample Output

yes 
no

Hint

     

就可以构造出 8/(3-8/3)=24.

#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#define INF 0x3f3f3f3f
#define ll long long
#define N 10010
#define M 1000000007
using namespace std;
double a[5];
bool dfs(int n)
{
	if(n==1)
	{
		if(fabs(a[0]-24)<1e-2)
			return true;
		else
			return false;
	}
	for(int i=0;i<n;i++)
	{
		for(int j=i+1;j<n;j++)
		{
			double x=a[i];
			double y=a[j];
			a[j]=a[n-1];
			a[i]=x+y;if(dfs(n-1)) return true;
			a[i]=x-y;if(dfs(n-1)) return true;
			a[i]=y-x;if(dfs(n-1)) return true;
			a[i]=x*y;if(dfs(n-1)) return true;
			if(y) a[i]=x/y;if(dfs(n-1)) return true;
			if(x) a[i]=y/x;if(dfs(n-1)) return true;
			a[i]=x;
			a[j]=y;
		}
	}
	return false;
}
int main()
{
	int t;
	int i,j;
	scanf("%d",&t);
	while(t--)
	{
		for(i=0;i<4;i++)
			scanf("%lf",&a[i]);
		if(dfs(4))
			printf("yes\n");
		else
			printf("no\n");
	}
	return 0;
}


 


你可能感兴趣的:(UESTC - 1252 24点游戏 (DFS)好题)