一副扑克牌算24点

/*************************************************************************
	> File Name: 24.cpp
	> Author: wangyeqiang
	> Mail: [email protected] 
	> Created Time: 2013年04月30日 星期二 16时41分34秒
	> 在一副扑克牌里四张扑克牌通过四则运算算出结果为24,以下是通过算法实现
	> 列出所有能算出24点的4张牌,并给出算式
 ************************************************************************/

#include <stdio.h>

int total = 0;

float option(int op,float a,float b)
{
	switch(op)
	{
		case 0:
			return a+b;
		case 1:
			return a-b;
		case 2:
			return a*b;
		case 3:
			return a/b;
	}
}

char mark(int op)
{
	switch(op)
	{
		case 0:
			return '+';
		case 1:
			return '-';
		case 2:
			return '*';
		case 3:
			return '/';
	}
}

/*****************************************************************************
 * 根据后缀表达式来判定其实只有四种种情况										 *
 *1, A B i C j D k;->((A i B) j C) k D;										 *
 *2, A B C i j D k;->(A j (B i C)) K D;										 *
 *3, A B C D i j k;->A k (B j (C i D));	
 *4, A B i C D j k;->(A i B) K (C j D);										 *
 *其中A B C D代表数字,i,j,k代表四则运算中的一种                             *
*****************************************************************************/
void calculate(float a,float b,float c,float d)
{
	for(int i=0;i<4;i++)
		for(int j=0;j<4;j++)
			for(int k=0;k<4;k++)
			{
				float temp;
				//情况1
				temp = option(i,a,b);
				temp = option(j,temp,c);
				temp = option(k,temp,d);
				if(temp==24.0)
				{
					total++;
					printf("#%d   ((A i B) j C) k D:  ((%d%c%d)%c%d)%c%d\n",total,(int)a,mark(i),(int)b,mark(j),(int)c,mark(k),(int)d);
				}
				//情况2
				temp = option(i,b,c);
				temp = option(j,a,temp);
				temp = option(k,temp,d);
				if(temp==24.0)
				{
					total++;
					printf("#%d   (A j (B i C)) K D:  (%d%c(%d%c%d))%c%d\n",total,(int)a,mark(j),(int)b,mark(i),(int)c,mark(k),(int)d);
				}
				//情况3
				temp = option(i,c,d);
				temp = option(j,b,temp);
				temp = option(k,a,temp);
				if(temp==24.0)
				{
					total++;
					printf("#%d   A K (B j (C i D)):  %d%c(%d%c(%d%c%d))\n",total,(int)a,mark(k),(int)b,mark(j),(int)c,mark(i),(int)d);
				}
				//情况四
				int temp1 = option(i,a,b);  
                                int temp2 = option(j,c,d);  
                                temp = option(k,temp1,temp2);  
                                if(temp==24.0)
				{
					total++;
					printf("#%d   (A i B) k (C j D):  (%d%c%d)%c(%d%c%d)\n",total,(int)a,mark(i),(int)b,mark(k),(int)c,mark(j),(int)d);
			        }
			}
}

int main()
{
	for(int a=1;a<=13;a++)
		for(int b=1;b<=13;b++)
			for(int c=1;c<=13;c++)
				for(int d=1;d<=13;d++)
					calculate((float)a,(float)b,(float)c,(float)d);
}


你可能感兴趣的:(一副扑克牌算24点)