24点

24点

算法借鉴 网址链接https://blog.youkuaiyun.com/huplion/article/details/42522239

因为4个数的四则运算有3个运算符,所以用3给for循环每次循环4次来一次一次循环尝试总共可能出现的4的3次方种可能,用户switch来给四则运算编号,可以最终确定选出的运算符,

​                                switch (j)
				{
				case 1:sum += b; break;
				case 2:sum -= b; break;
				case 3:sum *= b; break;
				case 4:
					{
						if (sum%b)
						{
							sum = 9999;
						}
						else
						{
							sum /= b;
						}
					}break;
​

在一次循环里用switch选择a+b或a-b等可能,但是在必须得排除除法有小数,可以用余数==1来派出强行除法的可能性,最后用3次循环嵌套试完64种可能。

​#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include<cstdio>
#include<iostream>
#include <cmath>
using namespace std;
//+-*/   1234
unsigned  long int xx[1001];
int x=1;
int pd;
char huoqu[3];
int f1(int a, int b, int c, int d)
{
	int sum;
	pd=0;
	char s1,s2,s3;
	for (int j = 1; j <= 4; j++)
	{
		for (int k = 1; k <= 4; k++)
		{
			for (int l = 1; l <= 4; l++)
			{
				sum = 0;
				sum += a;
				switch (j)
				{
				case 1:sum += b; break;
				case 2:sum -= b; break;
				case 3:sum *= b; break;
				case 4:
					{
						if (sum%b)
						{
							sum = 9999;
						}
						else
						{
							sum /= b;
						}
					}break;
				default:
					break;
				}
				switch (k)
				{
				case 1:sum += c; break;
				case 2:sum -= c; break;
				case 3:sum *= c; break;
				case 4:
					{
						if (sum%c)
						{
							sum = 9999;
						}
						else
						{
							sum /= c;
						}
					}break;
				default:
					break;
				}
				switch (l)
				{
				case 1:sum += d; break;
				case 2:sum -= d; break;
				case 3:sum *= d; break;
				case 4:
					{
						if (sum%d)
						{
							sum = 9999;
						}
						else
						{
							sum /= d;
						}
					}break;
				default:
					break;
				}
				switch (j)
				{
				case 1:s1='+';break;
				case 2:s1='-';break;
				case 3:s1='*';break;
				case 4:s1='/';break;
				}
				switch (k)
				{
				case 1:s2='+';break;
				case 2:s2='-';break;
				case 3:s2='*';break;
				case 4:s2='/';break;
				}
				switch (l)
				{
				case 1:s3='+';break;
				case 2:s3='-';break;
				case 3:s3='*';break;
				case 4:s3='/';break;
				}
				if (sum == 24)
				{
					if (x==0)
					{
						xx[x]=a*1000000+b*100000+c*10000+d*1000+j*100+k*10+l;
						x++;
						printf("((%d%c%d)%c%d)%c%d==24\n",a,s1,b,s2,c,s3,d);
						huoqu[0]=s1;
						huoqu[1]=s2;
						huoqu[2]=s3;

					}
					else
					{
						for (int i=1;i<=x;i++)
						{
							if ((a*1000000+b*100000+c*10000+d*1000+j*100+k*10+l)==xx[i])
							{
								pd=1;
								break;
							}
						}
						if (pd==0)
						{
							xx[x]=a*1000000+b*100000+c*10000+d*1000+j*100+k*10+l;
							x++;
							printf("((%d%c%d)%c%d)%c%d==24\n",a,s1,b,s2,c,s3,d);
							huoqu[0]=s1;
							huoqu[1]=s2;
							huoqu[2]=s3;
						}
					}
					return 1;
				}
			}
		}
	}
	return 0;
}
int f2(int a, int b, int c, int d)
{
	int sum = 0;
	sum = f1(a, b, c, d) + f1(a, b, d, c) + f1(a, c, b, d) + f1(a, c, d, b) + f1(a, d, b, c) + f1(a, d, c, b);
	if (sum != 0)
	{
		return 1;
	}
	else
	{
		return 0;
	}
}


void main()
{
	int card[4];
	int sum;
	printf("现在开始发牌\n======================\n你的4张手牌分别为\n");
	srand(time(NULL));
	for(int i=0;i<4;i++)
	{
		
		int m=1+rand()%13;
		card[i]=m;
		if(card[i]==11)
			printf("J           ");
		else if(card[i]==12)
			printf("Q           ");
		else if(card[i]==13)
			printf("K           ");
		else if(card[i]==1)
			printf("A           ");
		else
			printf("%d          ",card[i]);
	}
	printf("\n===================================\n");
	sum = f2(card[0], card[1], card[2], card[3]) + f2(card[0], card[1], card[2], card[3]) + f2(card[0], card[1], card[2], card[3]) + f2(card[0], card[1], card[2], card[3]);
	if (sum == 0)
	{
		cout << 'N' << endl;
	}
	f1(card[0], card[1], card[2], card[3]);
	/*char ch[15]; 
	for (int h = 0; h <15; h++)
	{
		scanf("%c", &ch[i]);
	}
	for (int j = 0; j <15; j++)
	{
		if(ch[j]==huoqu[0])
			for (j = j+1; j <15; j++)
				if(ch[j]==huoqu[1])
					for (j = j+1; j <15; j++)
						if(ch[j]==huoqu[2])
						{
							printf("完成");
							return;
						}
	}
*/
}
​
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值