题目描述
请你设计一个程序对该问题进行解答。
众所周知在扑克牌中,有一个老掉牙的游戏叫做 24 点,选取 4 张牌进行加减乘除,看是否能得出 24 这个答案。
现在小蓝同学发明了一个新游戏,他从扑克牌中依次抽出6张牌,注意不是一次抽出,进行计算,看是否能够组成 42 点,满足输出 YES
,反之输出 NO
。
最先抽出来的牌作为第一个操作数,抽出牌做第二个操作数,运算结果再当作第一个操作数,继续进行操作。
注:除不尽的情况保留整数,而且扑克牌的四张 10都丢了,不会出现 10。
请设计一个程序对该问题进行解答。
输入描述
输出仅一行包含 6 个字符。
保证字符 ∈ 3 4 5 6 7 8 9 10 J Q K A 2
。
输出描述
若给出到字符能够组成 42点 , 满足输出 YES
,反之输出 NO
。
解题思路:
每次枚举两个数,递归进行加减乘除的运算,剩下的数放到另一个数组里,每次计算之后的数字也重新放入那个数组中,直至最后只剩下一个数,这个数就是计算结果。
代码:
#include<bits/stdc++.h>
using namespace std;
char s[10];
int a[10];
bool jisuan(int *b,int k)
{
if(k==1)
{
if(b[0]==42)
{
return true;
}
else
return false;
}
int c[10];
for(int i=0;i<k-1;i++)
{
for(int j=i+1;j<k;j++)
{
int m=0;
for(int p=0;p<k;p++)
{
if(p!=i&&p!=j)
{
c[m++]=b[p];
}
}
c[m]=b[i]+b[j];
if(jisuan(c,m+1))
{
return true;
}
c[m]=b[i]-b[j];
if(jisuan(c,m+1))
{
return true;
}
c[m]=b[j]-b[i];
if(jisuan(c,m+1))
{
return true;
}
c[m]=b[i]*b[j];
if(jisuan(c,m+1))
{
return true;
}
if(b[j])
{
c[m]=b[i]/b[j];
if(jisuan(c,m+1))
{
return true;
}
}
if(b[i])
{
c[m]=b[j]/b[i];
if(jisuan(c,m+1))
{
return true;
}
}
}
}
return false;
}
int main()
{
for(int i=0;i<6;i++)
{
cin>>s[i];
if(s[i]=='A')
{
a[i]=1;
}
else if(s[i]=='J')
{
a[i]=11;
}
else if(s[i]=='Q')
{
a[i]=12;
}
else if(s[i]=='K')
{
a[i]=13;
}
else
a[i]=s[i]-'0';
}
if(jisuan(a,6))
{
cout<<"YES";
}
else
{
cout<<"NO";
}
return 0;
}