华为oj中级 24点运算

来源:互联网 发布:网络上不受欢迎的行为 编辑:程序博客网 时间:2024/06/17 21:11

描述
计算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”表示无解。

知识点 字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归
运行时间限制 10M
内存限制 128
输入
输入4张牌为字符串形式,以一个空格隔开,首尾无空格;
输出
如果输入的4张牌中包含大小王,则输出字符串“ERROR”,表示无法运算;
输出的算式格式为4张牌通过+-*/四个运算符相连,中间无空格,4张牌出现顺序任意,
只要结果正确;
输出算式的运算顺序从左至右,不包含括号,如1+2+3*4的结果为24
如果存在多种算式都能计算得出24,只需输出一种即可,如果无法得出24,
则输出“NONE”表示无解。

样例输入 A A A A
样例输出 NONE

#include<string>#include<iostream>using namespace std;int b[4],b1[4];     //b为输入的四张牌,b1为输出的四张牌。int flag[4]={0};   //表示四个数是否已经使用。char c[3];        //c为三个运算符int biaozhi=0;bool dfs(int num,int result){    if(num==4&&result==24)    {        for(int i=0;i<3;++i)        {            if(b1[i]==1)cout<<'A';            else if(b1[i]==11)cout<<'J';            else if(b1[i]==12)cout<<'Q';            else if(b1[i]==13)cout<<'K';            else cout<<b1[i];            cout<<c[i];        }        cout<<b1[3]<<endl;        biaozhi=1;        return true;    }    for(int i=0;i<4;++i)    {        if(flag[i])continue;        b1[num]=b[i];        flag[i]=1; c[num-1]='+';         if(dfs(num+1,result+b1[num]))return true; c[num-1]='-';if(dfs(num+1,result-b1[num]))return true;        c[num-1]='*';        if(dfs(num+1,result*b1[num]))return true;        c[num-1]='/';        if(result%b1[num]==0)            if(dfs(num+1,result/b1[num]))return true;        flag[i]=0;    }    return false;}int main(){    string a[4];    while(cin>>a[0]>>a[1]>>a[2]>>a[3])    {        for(int i=0;i<4;++i)        {            if(a[i].size()>2)            {                cout<<"ERROR"<<endl;                return 0;            }            else            {                if(a[i][0]>='2'&&a[i][0]<='9')b[i]=a[i][0]-'0';                else if(a[i][0]=='1')b[i]=10;                else if(a[i][0]=='J')b[i]=11;                else if(a[i][0]=='Q')b[i]=12;                else if(a[i][0]=='A')b[i]=1;                else b[i]=13;            }        }        int k;        for(k=0;k<4;++k)        {            b1[0]=b[k];            flag[k]=1;            dfs(1,b1[0]);            flag[k]=0;        }        if(biaozhi==0)cout<<"NONE"<<endl;    }    return 0;}
0 0