牛客网24点运算

题目描述

计算24点是一种扑克牌益智游戏,随机抽出4张扑克牌,通过加(+),减(-),乘(*), 除(/)四种运算法则计算得到整数24,本问题中,扑克牌通过如下字符或者字符串表示,其中,小写joker表示小王,大写JOKER表示大王: 

                   3 4 5 6 7 8 9 10 J Q K A 2 joker JOKER

本程序要求实现:输入4张牌,输出一个算式,算式的结果为24点。 

详细说明: 

1.运算只考虑加减乘除运算,没有阶乘等特殊运算符号,友情提醒,整数除法要当心; 

2.牌面2~10对应的权值为2~10, J、Q、K、A权值分别为为11、12、13、1; 

3.输入4张牌为字符串形式,以一个空格隔开,首尾无空格;如果输入的4张牌中包含大小王,则输出字符串“ERROR”,表示无法运算; 

4.输出的算式格式为4张牌通过+-*/四个运算符相连,中间无空格,4张牌出现顺序任意,只要结果正确; 

5.输出算式的运算顺序从左至右,不包含括号,如1+2+3*4的结果为24

6.如果存在多种算式都能计算得出24,只需输出一种即可,如果无法得出24,则输出“NONE”表示无解。

 

输入描述:

 

输入4张牌为字符串形式,以一个空格隔开,首尾无空格;

输出描述:

 

如果输入的4张牌中包含大小王,则输出字符串“ERROR”,表示无法运算; 

示例1

输入

复制

A A A A

输出

复制

NONE

这道模拟题在牛客网上列入的等级为苦难,整体来说除了模拟比较复杂一点,其余的还好。

推测通过100%叮叮叮,代码如下。

#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
int N[4];
int C[4];
char s1[10], s2[10], s3[10], s4[10];
char ans[19];
map > m_mapN;
map > m_mapC;
void setN(int i, int *a)
{
	vector v;
	v.push_back(a[0]);
	v.push_back(a[1]);
	v.push_back(a[2]);
	v.push_back(a[3]);
	m_mapN[i] = v;
}
void setC(int i, int *a)
{
	vector v;
	v.push_back(a[0]);
	v.push_back(a[1]);
	v.push_back(a[2]);
	v.push_back(a[3]);
	m_mapC[i] = v;
}
void getN(int *a)
{
	int i = 0;
	sort(a, a + 4);
	setN(i++, a);
	while (next_permutation(a, a + 4))
		setN(i++, a);
}
void getC(int *a)
{
	int i = 0;
	setC(i++, a);
	int b[4] = { 1,2,3,4};
	//while (next_permutation(a, a + 4))
	for (int j = 0; j < 4; j++)
	{
		a[0] = b[j];
		for (int jj = 0; jj < 4; jj++)
		{
			a[1] = b[jj];
			for (int jjj = 0; jjj < 4; jjj++)
			{
				a[2] = b[jjj];
				for (int j4 = 0; j4 < 4; j4++)
				{
					a[3] = b[j4];
					setC(i++, a);
				}
			}
		}
	}
}
int slove(char *s)
{
	if (strlen(s)>1)
		return 10;
	if (s[0] >= '2'&&s[0] <= '9')
		return s[0] - '0';
	if (s[0] == 'J')
		return 11;
	if (s[0] == 'Q')
		return 12;
	if (s[0] == 'K')
		return 13;
	if (s[0] == 'A')
		return 1;
}
int input()
{
	scanf("%s%s%s%s", s1, s2, s3, s4);
	if (strlen(s1)>2 || strlen(s2)>2 || strlen(s3)>2 || strlen(s4)>2)
		return -1;
	return 0;
}
int foo(int a1, int a2, int k)
{
	if (k == 1)
		return a1 + a2;
	if (k == 2)
		return a1 - a2;
	if (k == 3)
		return a1 / a2;
	return a1*a2;
}
int compute(vectorv1, vectorv2)
{
	int A = v1[0];
	A = foo(A, v1[1], v2[0]);
	A = foo(A, v1[2], v2[1]);
	A = foo(A, v1[3], v2[2]);
	return A;
}
char getc(int n)
{
	if (n == 1)
		return '+';
	if (n == 2)
		return '-';
	if (n == 3)
		return '/';
	if (n == 4)
		return '*';
}
int getans()
{
	for (int i = 0; i= 2 && m_mapN[i][i1] <= 9)
					{
						ans[l] = '0' + m_mapN[i][i1];
						l += 1;
					}
					else if (m_mapN[i][i1] == 1)
					{
						ans[l] = 'A';
						l += 1;
					}
					else if (m_mapN[i][i1] == 10)
					{
						ans[l] = '1';
						l += 1;
						ans[l] = '0';
						l += 1;
					}
					else if (m_mapN[i][i1] == 11)
					{
						ans[l] = 'J';
						l++;
					}
					else if (m_mapN[i][i1] == 12)
					{
						ans[l] = 'Q';
						l++;
					}
					else if (m_mapN[i][i1] == 13)
					{
						ans[l] = 'K';
						l++;
					}
					ans[l++] = getc(m_mapC[j][i1]);
				}
				l -= 1;
				ans[l] = '\0';
				return 1;
			}
		}
	}
	return 0;
}
int main()
{
	int n1 = input();
	if (n1 == -1)
	{
		cout << "ERROR" << endl;
	}
	else
	{
		N[0] = slove(s1);
		N[1] = slove(s2);
		N[2] = slove(s3);
		N[3] = slove(s4);
		C[0] = 1; C[1] = 2; C[2] = 3; C[3] = 4;
		getN(N);
		getC(C);
		if (getans())
			cout << ans << endl;
		else
			cout << "NONE" << endl;
	}
	return 0;
}

 

你可能感兴趣的:(stl,模拟题,C++)