UESTC--1252--24点游戏(dfs)



24点游戏

Time Limit: 1000MS Memory Limit: 65535KB 64bit IO Format: %lld & %llu

Status

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

Hint

 3  3  8  8

就可以构造出  8÷(3–8÷3)=24

Source

第七届ACM趣味程序设计竞赛第二场(正式赛)

看着像一个排列组合一样,把所有的数字排序,然后列举所有可能的运算,这里传递的参数只有一个x,用来表示已经运算的次数,显然总共要运算四次,每次运算的时候取num【i】与后边的数字进行运算,x-1表示运算次数减少一个,区间也会减少,但是因为num【j】已经使用了,所以把将要消失的num【x-1】给num【j】,使得每一个数字都会被用到,因为运算结果尽量前移并且区间向前减小,所以最后结果存储在num【0】中,数据类型是double的,存储是近似存储,需要判断精度
#include<cstdio>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
using namespace std;
double num[10];
bool flag;
bool dfs(int x)
{
	if(x==1)
	{
		if(fabs(num[0]-24)<1e-2)
		return true;
		else 
		return false;
	}
	double a,b;
	for(int i=0;i<x;i++)
	{
		for(int j=i+1;j<x;j++)
		{
			a=num[i];
			b=num[j];
			num[j]=num[x-1];//x表示运算的次数,也用来确定区间,
			//每次x-1,同时区间缩小,num[0]作为运算的结果 
			num[i]=a+b;if(dfs(x-1)) return true;
			num[i]=a-b;if(dfs(x-1)) return true;
			num[i]=b-a;if(dfs(x-1)) return true;
			num[i]=a*b;if(dfs(x-1)) return true;
			if(b!=0) num[i]=a/b;if(dfs(x-1)) return true;//除法分母不为0 
			if(a!=0) num[i]=b/a;if(dfs(x-1)) return true;
			num[i]=a;//回溯 
			num[j]=b;
		}
	}
	return false;
}
int main()
{
	int t;
	cin>>t;
	while(t--)
	{
		flag=false;
		for(int i=0;i<4;i++)
		cin>>num[i];
		if(dfs(4))
		cout<<"yes"<<endl;
		else 
		cout<<"no"<<endl;
	}
	return 0;
}

转载于:https://www.cnblogs.com/playboy307/p/5273420.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值