码迷,mamicode.com
首页 > 其他好文 > 详细

nyoj43 24 Point game(DFS)

时间:2015-07-29 10:16:47      阅读:86      评论:0      收藏:0      [点我收藏+]

标签:nyoj43   nyoj 43   24 point game   dfs   

24 Point game

时间限制:3000 ms  |  内存限制:65535 KB
难度:5
描述

There is a game which is called 24 Point game.

In this game , you will be given some numbers. Your task is to find an expression which have all the given numbers and the value of the expression should be 24 .The expression mustn‘t have any other operator except plus,minus,multiply,divide and the brackets. 

e.g. If the numbers you are given is "3 3 8 8", you can give "8/(3-8/3)" as an answer. All the numbers should be used and the bracktes can be nested. 

Your task in this problem is only to judge whether the given numbers can be used to find a expression whose value is the given number。

输入
The input has multicases and each case contains one line
The first line of the input is an non-negative integer C(C<=100),which indicates the number of the cases.
Each line has some integers,the first integer M(0<=M<=5) is the total number of the given numbers to consist the expression,the second integers N(0<=N<=100) is the number which the value of the expression should be.
Then,the followed M integer is the given numbers. All the given numbers is non-negative and less than 100
输出
For each test-cases,output "Yes" if there is an expression which fit all the demands,otherwise output "No" instead.
样例输入
2
4 24 3 3 8 8
3 24 8 3 3
样例输出
Yes
No
来源
经典改编
上传者
张云聪


感觉非常经典的一道深搜题。昨天下午自己起初给sum定义了一个初始值0。后来发现第二个测试用例不对。。。那时候实在是不知道哪里错了

以至于昨天晚上做梦都梦到自己AC了这道题 哈哈技术分享技术分享

我自己觉得自己的方法没有错。于是今天早上就百度搜搜,发现没人和我的思想一样技术分享技术分享....别人都说是编程之美这本书上的。。可是我也没看过

他们的思想都是在一个长度为n的数组中找到任意两个数,然后求和,然后把和再插入数组中,同时n--。直到n=1.

o(︶︿︶)o ,我就只好关闭了百度。看着自己的程序慢慢调试,并且输出每一个可能的结果值。。后来还真被我发现了。。因为我初始的sum为0的缘故,

如果只有一个元素5,本来该只有一个结果的。。可是由于我的原因会出现0-5=-5,0+5=5,0*5=0,0/5=0。。。。傻了傻了。。

于是就又改了下AC了 。。嘿嘿。看来我的梦还是挺灵验的。。

看代码吧:

#include <stdio.h>
#include <math.h>
#include <string.h>
int flag,n;
double a[10],aim;//double型的把 因为相除嘛 难免会造成精度损失
int vis[10];
void dfs(double sum)
{
	int cnt=0;
	for(int i=0;i<n;i++)
	if(vis[i])
	cnt++;
	if(cnt==n&&fabs(sum-aim)<0.0000001)//一个判断的条件。当所有元素都用上。而且sum和aim相差很小
	{
		flag=1;
		return ;
	}
	for(int i=0;i<n;i++)
	{
		if(!vis[i]&&!flag)
		{
			vis[i]=1;
			dfs(sum+a[i]);//
			dfs(sum-a[i]);//
			dfs(sum*a[i]);//
			dfs(sum/a[i]);//
			dfs(a[i]/sum);//
			dfs(a[i]-sum);//对于这个数sum只能有6种情况
			vis[i]=0;
		}
	}
}
int main()
{
	int ncase;
	scanf("%d",&ncase);
	while(ncase--)
	{
		scanf("%d %lf",&n,&aim);
		for(int i=0;i<n;i++)
		scanf("%lf",&a[i]);
		flag=0;
		for(int i=0;i<n;i++)//
		{
			memset(vis,0,sizeof(vis));
			vis[i]=1;
			if(!flag)
			dfs(a[i]);//起初的sum不应该为0,应该是数组中的某一个数、、
		}//起初我没有上面这个for循环,只有一个dfs(0);华丽丽的wa...
		if(flag)
		printf("Yes\n");
		else
		printf("No\n");
	}
	return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

nyoj43 24 Point game(DFS)

标签:nyoj43   nyoj 43   24 point game   dfs   

原文地址:http://blog.csdn.net/su20145104009/article/details/47122001

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!