`

24点算法

 
阅读更多

 

#include <iostream>
#include <vector>
#include <math.h>

//c1:	(((A,B),C),D)
//c2:	((A,B),(C,D))

std::vector< std::vector<double> > permutaionSet;

void swap(double* left, double* right){
	double temp;
	temp = *left;
	*left = *right;
	*right = temp;
}

int  permutaion(double *input,int depth, int len){

	if(depth > len){
		std::cout << "input error!" << std::endl;
		return -1;
	}

	if(depth == len){
		std::vector<double> temp(input,input+len);
		permutaionSet.push_back(temp);
		return permutaionSet.size();
	}

	for(int i=depth; i<len; i++){
		swap(input+depth,input+i);
		permutaion(input,depth+1,len);
		swap(input+depth,input+i);
	}
	return -2;
}

char op[] = {'+', '-', '*', '/'};
double calculator(double left, double right, char op){
	switch (op)
	{
	case '+':
		return left+right;
	case '-':
		return left-right;
	case '*':
		return left*right;
	case '/':
		return left/right;
	default:
		return 0;
	}
}

//c1:	(((A,B),C),D)
double operatoration(int first_op, int second_op, int third_op,std::vector<double>& numbers){
	return calculator(
				calculator(
					calculator(numbers[0],numbers[1],op[first_op]),
						numbers[2],op[second_op]),
							numbers[3],op[third_op]);
}

//c2:	((A,B),(C,D))
double operatoration2(int first_op, int second_op, int third_op,std::vector<double>& numbers){
	return calculator(
		calculator(numbers[0],numbers[1],op[first_op]),
		calculator(numbers[2],numbers[3],op[third_op]),
		op[second_op]);
}

#define EPSSLON 0.000001

bool judge(const int itorator){

	std::vector<double> temp(permutaionSet[itorator]);
	for(int i=0; i<4; i++)
		for(int j=0; j<4; j++)
			for(int k=0; k<4; k++)
				if(		(fabs(24-operatoration(i,j,k,temp)) <= EPSSLON ) 
						|| (fabs(24-operatoration2(i,j,k,temp)) <= EPSSLON )	)
					return true;
	return false;
}

bool Game24Points(int a, int b, int c, int d){
	double input[4];
	double *ptr = input;
	*ptr++ = a, *ptr++ = b, *ptr++ = c, *ptr++ = d;
	permutaionSet.clear();
	permutaion(input,0,4);

	for(size_t i=0; i<permutaionSet.size(); i++)
		if(judge(i))
			return true;
	return false;
}


int _tmain(int argc, _TCHAR* argv[]){
	

	std::cout << Game24Points(7,7,7,7) << " "<< Game24Points(1,2,3,4) << " " << Game24Points(7,2,1,10);

	system("pause");
	return 0;
}

 算法的思想是:

 

24点算法是4个数字之间通过,加、减、乘、除、括号使得最终的结果为24.

先将4个数字进行一次全排列,这个全排列包括了4个数字的所有出现顺序

选择一种排列,对这4个数字进行括号操作,总共有一下两种括号操作形式:

//c1:    (((A,B),C),D)
//c2:    ((A,B),(C,D))最后将上面两个式子中加上运算符(式子中逗号的位置换上运算符),判断结果是否为24

分享到:
评论

相关推荐

    二十四点算法

    NULL 博文链接:https://andyjojo.iteye.com/blog/319531

    c#关于24点算法

    24点算法是一种经典的数学游戏,源自中国的扑克牌游戏,目标是通过加减乘除运算,使四张1到13之间的数字牌得出24。在编程领域,我们可以用C#来实现这个算法,将其转化为计算机可以处理的问题。下面将详细探讨如何用...

    24点算法 (C++实现)

    C++ 递归实现24点算法, 输入数组,返回所有可以组成24点的结果,并且自动去重 结果为算式 如: (2+10)*2*1=24

    算24点 24点算法 源代码和程序

    《探究24点算法:源代码与程序解析》 24点游戏,作为一个经典而富有挑战性的数学游戏,深受广大玩家喜爱。它基于四则运算,通过加、减、乘、除运算,使得四个给定的自然数(通常是1到13之间)组合运算后得到结果为...

    24点算法的实现(24点游戏源码).

    24点游戏是一种广受欢迎的智力游戏,玩家需要在四张扑克牌中通过加减乘除运算找出一种或多种方式使结果等于24。在这个场景中,我们关注的是"24点算法的实现",这涉及到编程技术,尤其是C++语言,以及可能用到的图形...

    24点算法及程序

    标题中的“24点算法及程序”指的是一个数学游戏,玩家需要从四张包含1到13的扑克牌中,通过加、减、乘、除和括号的操作,使得计算结果等于24。这个概念在计算机编程中可以转化为一个算法问题,即编写一个程序来自动...

    24点算法 课程设计

    从给定的文件信息来看,这是一段关于24点算法的C++源代码,用于课程设计项目。24点游戏是一种数学游戏,通常由四张扑克牌组成,玩家需要利用加、减、乘、除(每张牌只能用一次)来使结果等于24。以下是对这段代码的...

    计算24点算法

    "计算24点"是一个经典的数学游戏,挑战玩家利用加减乘除运算符以及括号,将四张扑克牌上的数字组合成24。在这个问题中,我们要讨论的是实现这个功能的算法,即如何设计一个程序自动找到这些计算公式。 首先,我们...

    java 扑克牌24点算法

    本算法实现了24点游戏的基本功能,即给定四个数字(1-10),输出所有可能的运算方式使其结果等于24。该算法利用了多重循环来进行数据组合,并通过递归思想进行四则运算。需要注意的是,在实际开发过程中,为了提高...

    C#24点算法

    这是C#的控制台程序,用不到70行代码解决了24点游戏的算法问题。给出4个数字,能够计算4个数字加减乘除后得到24的所有式子。代码里对括号进行了处理。

    java 24 点算法

    一个java24点算法

    24点算法及算术运算算法

    首先,24点算法的核心在于如何有效地组合与排列这四张牌。这需要对数字的性质有深刻的理解,例如整除、余数、乘方等。在这个过程中,堆栈(Stack)数据结构扮演了重要的角色。堆栈是一种后进先出(LIFO)的数据结构...

    24点 自动求解程序_24点算法小程序_

    24点游戏是一种广受欢迎的智力游戏,玩家需要利用四张1到13的扑克牌,通过加减乘除运算,使得结果等于24。在这个背景下,"24点自动求解程序"是一个利用计算机算法解决24点问题的软件。这个程序可以帮玩家找出所有...

    24点算法,不正确你抽我

    24点算法,穷举12288种可能,不正确你抽我。

    基于24点算法的报告和总结

    24点算法是一种经典的数学游戏,目标是通过加、减、乘、除四种基本运算,使得四张1到10的扑克牌组合得出24点。在这个问题中,我们有40张扑克牌(每种1到10的数字各两张,不区分花色),每次从中随机抽取4张,尝试...

    24点算法,基于VC++

    24点算法是一种基于数学和逻辑的娱乐游戏,玩家需要从四张1-13的扑克牌中,通过加、减、乘、除运算,使得结果等于24。这个过程涉及到数学策略、逻辑推理以及计算机编程的实现。在本文中,我们将深入探讨如何使用C++...

    算24点 算法经典 回溯法

    《算24点算法经典——回溯法解析》 在计算机科学中,算24点是一种基于数学和逻辑思维的游戏,玩家需要通过加、减、乘、除运算,以及括号的使用,使得四张扑克牌上的数字组合运算后得到24。这种问题的解决方法之一...

    24点算法(穷举法)

    24点算法是一种基于四则运算的智力游戏,目标是通过加、减、乘、除四种运算符(可能包括括号来改变运算顺序),将给定的四个数字组合成24。这里提到的是使用C++编程语言实现的一种穷举法策略,即尝试所有可能的运算...

Global site tag (gtag.js) - Google Analytics