CSUOJ 1600 Twenty-four point (判断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);
	}
}
时间: 2024-10-29 19:06:54

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

Java Enum枚举 遍历判断 四种方式(包括 Lambda 表达式过滤)

package com.miracle.luna.lambda; import java.util.Arrays; /** * @Author Miracle Luna * @Date 2019/6/9 23:40 * @Version 1.0 */ public enum AlarmGrade { ATTENTION("attention", "提示"), WARNING("warning","警告"), SERIOUS(&

小浩算法|一文让你学会如何用代码判断"24"点

"24点"是一种数学游戏,正如象棋.围棋一样是一种人们喜闻乐见的娱乐活动.它始于何年何月已无从考究,但它以自己独具的数学魅力和丰富的内涵正逐渐被越来越多的人们所接受.今天就为大家分享一道关于"24点"的算法题目. 话不多说,直接看题. 题目:你有 4 张写有 1 到 9 数字的牌.你需要判断是否能通过 *,/,+,-,(,) 的运算得到 24. 示例 1: 输入: [4, 1, 8, 7] 输出: True 解释: (8-4) * (7-1) = 24 示例 2:

多重背包并判断能否装满(附01完全背包思想)

这是我们作业上的一道题,也是我认为挺好玩的一道题,是裸的多重背包,不过它只是单纯的让我判断能否装满.我第一次交TLE了,我以为作业题的数据不会很强,干脆偷了个懒枚举了下选的个数,没有二进制优化直接超时了,低估出题老师了~所以我又加上了二进制优化,经历一番坎坷才过. 关于这个背包的知识,我想多说一点,毕竟越是基础的东西越是要加强理解啊…… 首先,说01和完全背包,这两个都是很基础的背包,他们两个的区别在于是由当前状态转移而来还是由上一个状态转移而来,由当前状态转移而来代表可是选无数个,就是完全背包

任意1-10中的4个数字,使用加减乘除计算得出24结果的可能组合(java版),很多人小时候都玩过

目录 需求: 需求该如何分析呢,怎么划分成小需求呢? 如何把小需求编排成完整需求: 学有所得 学会分析需求,由哪些组成(规则,逻辑等); 能把的需求分解成很多子需求.或孙需求.或童孙需求,直到每个需求很清晰可实施地为止 学会把各种子孙需求,通过组合编排,最终成为一个完整的大需求解决方案 需求 需求:任意1-10中的4个数字,使用加减乘除计算得出24结果的可能组合:通过初步分析,我们可以得到如下规则: 规则:1.任意1-10中的4个数字: 2.使用加减乘除计算得出24; 3.在任何一次计算中不能出

js判断文件类型大小并给出提示

上传文件是工作中常用的功能,不同的场景对不同的文件类型和文件大小都有不同的要求: <form id="uploadForm" method="post" class="layui-form"> <div class="layui-form-item"> <label class="layui-form-label">名称</label> <div cla

回文判断

一个整形数是否是回文 also leetcode 9 Palindrome Number要求空间复杂度O(1)按位判断一般是/和%的游戏,首先取首位 a/h (h是最接近a的10的次方,比如12321,h预计算出是10000), 再取末位a%10; 比较首位和末位是否相等,不等就返回false; 如图: 然后舍弃掉已经比较过的两个位数,从a中去掉首尾 12321 --> 232. a = a % h; // 去掉首 a = a /10; //去掉尾 h = 100; // 因为已经去掉了两位 如

24点游戏_简单界面_可直接运行

1 #include<Windows.h> 2 #include<iostream> 3 #include<cstdio> 4 #include<cstdlib> 5 #include<cstring> 6 #include<string> 7 #include<vector> 8 #include<ctime> 9 #include<cmath> 10 using namespace std; 1

HDU 1247 速算24点_BFS

1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #define CL(x, y) memset(x, y, sizeof(x)) 5 using namespace std; 6 const int INF = 1 << 30; 7 int num[4], res[4], used[4]; 8 int flag; 9 int getNum(char ch); 10 int ca

最短路之双判断条件

问题 D: 最短路径问题 时间限制: 1 Sec  内存限制: 32 MB提交: 41  解决: 13[提交][状态][讨论版] 题目描述 给你n个点,m条无向边,每条边都有长度d和花费p,给你起点s终点t,要求输出起点到终点的最短距离及其花费,如果最短距离有多条路线,则输出花费最少的. 输入 输入n,m,点的编号是1~n,然后是m行,每行4个数 a,b,d,p,表示a和b之间有一条边,且其长度为d,花费为p.最后一行是两个数 s,t;起点s,终点t.n和m为0时输入结束.(1<n<=1000