华为编程大赛——24点游戏

24点是一种益智游戏,24点是把4个整数(一般是正整数)通过加减乘除以及括号运算,
使最后的计算结果是24的一个数学游戏,24点可以考验人的智力和数学敏感性,
它能在游戏中提高人们的心算能力。24点通常是使用扑克牌来进行游戏的,
一副牌中抽去大小王后还剩下52张(如果初练也可只用1~10这40张牌),
任意抽取4张牌(称为牌组),用加、减、乘、除(可加括号)把牌面上的数算成24。
每张牌必须只能用一次,如抽出的牌是3、8、8、9,那么算式为

(9-8)×8×3或3×8÷(9-8)或(9-8÷8)×3等。

#include <stdlib.h>
#include <string.h>
#include <stdio.h>

double  cal(double a,double b,int op)  // op: 0:+,1:-,2:*,3:/
{
	switch (op){       // +-x/ 运算

		case 0:
		   return(a+b);
		case 1: 
		   return(a-b);
		case 2: 
		   return(a*b);
	}
    if (b==0.0)             //  分母为0
        return(99999.0);
    else
        return(a/b);
}
bool    isEqual(double d1,double d2) // 两个浮点数是否近似相等
{
        double d=d1-d2;
        if (d<0)
            d=-d;            // 求绝对值

        return(d<=0.00001);
}
bool Game24Points(int v0, int v1, int v2, int v3)
{
	int v[4];                      // 输入四整数
	v[0]=v0; v[1]=v1;v[2]=v2; v[3]=v3;

	int findFlag=0;

	//-----------四重循环开始穷举四个数字的位置: 4!=24 种--------------------------
	int count=0;                              // 计数成功次数
	for (int i1=0;i1<4&&findFlag==0;i1++)
        for (int i2=0;i2<4&&findFlag==0;i2++) // 四重循环对四个数穷举
			if (i2!=i1)
			for (int i3=0;i3<4&&findFlag==0;i3++)
				if (i3!=i2 && i3!=i1)
				for (int i4=0;i4<4&&findFlag==0;i4++)
					if (i4!=i3 && i4!=i2 && i4!=i1)
					for (int f1=0; f1<4&&findFlag==0; f1++ )//三重循环开始穷举三个运算符: 4X4X4=64 种
						for (int f2=0; f2<4&&findFlag==0; f2++)	// 三重循环对运算符穷举
							for (int f3=0; f3<4&&findFlag==0; f3++) // 运算符 f1,f2,f3
							{    
								// 对运算优先级直接列举(5种)

								//未用循环,直接穷举三个运算符的优先级: 3+2=5种
								double t1,t2,t3;      // 存放计算的中间值
								
								// 第1种情况  ((a 。b)。c)。d  :
								t1=cal(v[i1],v[i2],f1);
								t2=cal(t1,v[i3],f2);
								t3=cal(t2,v[i4],f3);
								if (isEqual(t3,24)) // 运算后是否为24					
									findFlag=1;
								
								// 第2种情况(a 。b)。(c。 d) 开始计算 :
								t1=cal(v[i1],v[i2],f1);
								t2=cal(v[i3],v[i4],f3);
								t3=cal(t1,t2,f2);
								if (isEqual(t3,24)) // 运算后是否为24
									findFlag=1;

							   // 第3种情况 (a。(b。c))。d  开始计算 :

							   t1=cal(v[i2],v[i3],f2);
							   t2=cal(v[i1],t1,f1);
							   t3=cal(t2,v[i4],f3);
							   if (isEqual(t3,24)) //运算后是否为24
								   findFlag=1;
							 
							   // 第4种情况  a。((b。c)。d ) 开始计算:
							   t1=cal(v[i2],v[i3],f2);
							   t2=cal(t1,v[i4],f3);
							   t3=cal(v[i1],t2,f1);
							   if (isEqual(t3,24))//运算后是否为24
									findFlag=1;
							   
							   // 第5种情况 a。(b。(c。d)) 开始计算:
							   t1=cal(v[i3],v[i4],f3);
							   t2=cal(v[i2],t1,f2);
							   t3=cal(v[i1],t2,f1);
							   if (isEqual(t3,24)) //运算后是否为24
								   findFlag=1;
							}
				
	//-------------- 穷举结束: 共 24*64*5=7680 种表达式 --
	if(findFlag==1)
		return true;
	else
		return false;  

}

int main(){
	
	printf("%d\n",Game24Points(5,5,5,2));

	printf("%d\n",Game24Points(5,5,5,1));

	printf("%d\n",Game24Points(1,2,3,4));

	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值