1. 题目描述
计算 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 ”表示无解。
2. 输入描述:
输入4张牌为字符串形式,以一个空格隔开,首尾无空格;
3. 输出描述:
如果输入的4张牌中包含大小王,则输出字符串“ERROR”,表示无法运算;
4. 代码:
思想:穷举法
#include <iostream>
#include <string>
//#include <vector>
#include <algorithm>
using namespace std;
string in[4];
int data[5];
char alg[4]={'+','-','*','/'};//四则运算
int flag=0;
bool isOk()
{
for(int i=0;i<4;i++)
{
if(in[i]=="JOKER"||in[i]=="Joker")
{
return false;
}
}
return true;
}
//权重转换
int trans(string s)
{
int n;
char c=s[0];
if(c!='J'&&c!='Q'&&c!='K'&&c!='A')
n=c-'0';
else if(c=='J')
n=11;
else if(c=='Q')
n=12;
else if(c=='K')
n=13;
else
n=1;
return n;
}
int yunsuan2(int &x1,int x2,int index)//二则运算
{
switch(alg[index])
{
case '+':
return x1+x2;
break;
case '-':
return x1-x2;
break;
case '*':
return x1*x2;
break;
case '/':
{
if(x2!=0&&x1%x2==0)
return x1/x2;
else
return -100;
break;
}
default:
return -200;
}
}
void pro(int a1,int a2,int a3,int a4)//计算,数据顺序
{
for(int i=0;i<4;i++)
{
int sum=0;//临时变量
if(flag==1)
break;
else
{
sum=yunsuan2(data[a1],data[a2],i);
int tmp=sum;//临时变量
for(int j=0;j<4;j++)
{
if(flag==1)
break;
else
{
sum=yunsuan2(sum,data[a3],j);
int tp=sum;//临时变量,防止后面被改变
for(int k=0;k<4;k++)
{
sum=yunsuan2(tp,data[a4],k);
if(sum==24&&flag==0)
{
cout<<in[a1-1]<<alg[i]<<in[a2-1]<<alg[j]<<in[a3-1]<<alg[k]<<in[a4-1]<<endl;
flag=1;
break;
}
sum=tp;
}
}
sum=tmp;
}
sum=tmp;//临时变量
}
sum=0;
}
}
int main()
{
while(cin>>in[0]>>in[1]>>in[2]>>in[3])
{
if(isOk())
{
//先计算权重
data[0]=0;
for(int i=0;i<4;i++)
data[i+1]=trans(in[i]);
//sort(data.begin(),data.end());
//计算24点
flag=0;
pro(1,2,3,4);
if(flag==0)
pro(1,2,4,3);
if(flag==0)
pro(1,3,2,4);
if(flag==0)
pro(1,3,4,2);
if(flag==0)
pro(1,4,2,3);
if(flag==0)
pro(1,4,3,2);
if(flag==0)
pro(2,1,3,4);
if(flag==0)
pro(2,1,4,3);
if(flag==0)
pro(2,3,1,4);
if(flag==0)
pro(2,3,4,1);
if(flag==0)
pro(2,4,3,1);
if(flag==0)
pro(2,4,1,3);
if(flag==0)
pro(3,1,2,4);
if(flag==0)
pro(3,1,4,2);
if(flag==0)
pro(3,2,4,1);
if(flag==0)
pro(3,2,1,4);
if(flag==0)
pro(3,4,1,2);
if(flag==0)
pro(3,4,2,1);
if(flag==0)
pro(4,1,3,2);
if(flag==0)
pro(4,1,2,3);
if(flag==0)
pro(4,2,1,3);
if(flag==0)
pro(4,2,3,1);
if(flag==0)
pro(4,3,2,1);
if(flag==0)
pro(4,3,1,2);
if(flag==0)
cout<<"NONE"<<endl;
}
else
cout<<"ERROR"<<endl;
flag=0;
}
return 0;
}