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

CSUOJ 1600 Twenty-four point (判断24点,另附给出表达式版)

时间:2015-05-07 10:29:08      阅读:140      评论:0      收藏:0      [点我收藏+]

标签:计算24点


1600: Twenty-four point

Time Limit: 1 Sec  Memory Limit: 128 MB
Submit: 296  Solved: 38
[Submit][Status][Web Board]

Description

Given four numbers, can you get twenty-four through the addition, subtraction, multiplication, and division? Each number can be used only once.

Input

The input consists of multiple test cases. Each test case contains 4 integers A, B, C, D in a single line (1 <= A, B, C, D <= 13).

Output

For each case, print the “Yes” or “No”. If twenty-four point can be get, print “Yes”, otherwise, print “No”.

Sample Input

2 2 3 9
1 1 1 1 
5 5 5 1

Sample Output

Yes
No
Yes

HINT

For the first sample, (2/3+2)*9=24.


题目链接:http://acm.csu.edu.cn/OnlineJudge/problem.php?id=1600

题目大意:给四个数判断能否算出24

题目分析:直接DFS爆搜,每次计算两个数字再放进数组,知道数组里只有一个数为止


#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
double EPS = 1e-10;
double num[4];
bool flag;

bool equel(double a, double b)
{
	if(fabs(a - b) <= EPS)
		return true;
	return false;
}

void DFS(int n)
{
	if(flag || (n == 1 && equel(num[0], 24)))
	{
		flag = true;
		return;
	}
	for(int i = 0; i < n; i++)
	{
		for(int j = i + 1; j < n; j++)
		{
			double c1 = num[i], c2 = num[j];
			num[j] = num[n - 1];
			num[i] = c1 + c2;
			DFS(n - 1);
			num[i] = c1 - c2;
			DFS(n - 1);
			num[i] = c2 - c1;
			DFS(n - 1);
			num[i] = c1 * c2;
			DFS(n - 1);
			if(!equel(c2, 0))
			{
				num[i] = c1 / c2;
				DFS(n - 1);
			}
			if(!equel(c1, 0))
			{
				num[i] = c2 / c1;
				DFS(n - 1);
			}
			num[i] = c1;
			num[j] = c2;
		}
	}
}

int main()
{
	while(scanf("%lf %lf %lf %lf", &num[0], &num[1], &num[2], &num[3]) != EOF)
	{
		flag = false;
		DFS(4);
		printf("%s\n", flag ? "Yes" : "No");
	}
}


另外考虑,输出解的个数和所有解的方法,其实只要用字符串记录一下就可以了


#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <iostream>
#include <string>
using namespace std;
double EPS = 1e-10;
double num[4];
bool flag;
int cnt;
string re[4];

bool equel(double a, double b)
{
	if(fabs(a - b) <= EPS)
		return true;
	return false;
}

void DFS(int n)
{
	if(n == 1 && equel(num[0], 24))
	{
		cnt ++;
		cout << re[0] << endl;
		return;
	}
	for(int i = 0; i < n; i++)
	{
		for(int j = i + 1; j < n; j++)
		{
			double c1 = num[i], c2 = num[j];
			string re1, re2;
			num[j] = num[n - 1];
			num[i] = c1 + c2;
			re1 = re[i];
			re2 = re[j];
			re[j] = re[n - 1];
			re[i] = '(' + re1 + '+' + re2 + ')';
			DFS(n - 1);
			num[i] = c1 - c2;
			re[i] = '(' + re1 + '-' + re2 + ')';
			DFS(n - 1);
			num[i] = c2 - c1;
			re[i] = '(' + re2 + '+' + re1 + ')';
			DFS(n - 1);
			num[i] = c1 * c2;
			re[i] = '(' + re1 + '*' + re2 + ')';
			DFS(n - 1);
			if(!equel(c2, 0))
			{
				num[i] = c1 / c2;
				re[i] = '(' + re1 + '/' + re2 + ')';
				DFS(n - 1);
			}
			if(!equel(c1, 0))
			{
				num[i] = c2 / c1;
				re[i] = '(' + re2 + '/' + re1 + ')';
				DFS(n - 1);
			}
			num[i] = c1;
			num[j] = c2;
			re[i] = re1;
			re[j] = re2;
		}
	}
}

int main()
{
	while(scanf("%lf %lf %lf %lf", &num[0], &num[1], &num[2], &num[3]) != EOF)
	{
		re[0] = num[0] + '0';
		re[1] = num[1] + '0';
		re[2] = num[2] + '0';
		re[3] = num[3] + '0';
		cnt = 0;
		DFS(4);
		printf("Answer num: %d\n", cnt);
	}
}

CSUOJ 1600 Twenty-four point (判断24点,另附给出表达式版)

标签:计算24点

原文地址:http://blog.csdn.net/tc_to_top/article/details/45556031

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