列表

详情


HJ89. 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/3=0,3/2=1
2.牌面2~10对应的权值为2~10, JQKA权值分别为为1112131
3.输入4张牌为字符串形式,以一个空格隔开,首尾无空格;如果输入的4张牌中包含大小王,则输出字符串“ERROR”,表示无法运算;
4.输出的算式格式为4张牌通过+-*/四个运算符相连,中间无空格4张牌出现顺序任意,只要结果正确;
5.输出算式的运算顺序从左至右,不包含括号,如1+2+3*4的结果为24,2 A 9 A不能变为(2+1)*(9-1)=24
6.如果存在多种算式都能计算得出24,只需输出一种即可,如果无法得出24,则输出“NONE”表示无解。
7.因为都是扑克牌,不存在单个牌为0的情况,且没有括号运算,除数(即分母)的数字不可能为0

数据范围:一行由4张牌组成的字符串

输入描述

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

输出描述

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

示例1

输入:

A A A A

输出:

NONE

说明:

不能实现

示例2

输入:

4 2 K A

输出:

K-A*4/2

说明:

A+K*2-4也是一种答案,输出任意一种即可

示例3

输入:

B 5 joker 4

输出:

ERROR

说明:

存在joker,输出ERROR

示例4

输入:

K Q 6 K

输出:

NONE

说明:

按一般的计算规则来看,K+K-(Q/6)=24 或 K-((Q/6)-K)=24,但是因为这个题目的运算不许有括号,所以去掉括号后变为 K+K-Q/6=26-Q/6=14/6=2 或 K-Q/6-K=1/6-K=0-K=-13,其它情况也不能运算出24点,故不存在,输出NONE

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C 解法, 执行用时: 2ms, 内存消耗: 320KB, 提交时间: 2022-02-08

#include <stdio.h>
#include <string.h>
//将读入字符转换为数字存储,判断是否有王
//DFS回溯遍历,剪枝函数 约束 used 限界 pos
//确定总的DFS深度 pos 4  每个深度上的分叉数+-*/,pos==0一定是+;
//用cal 记录数组和符号;
//将数组转化为字符串输出


int cal_num[4];
char cal_signal[4];
int flag;
int used[4] = {0};
void compute(int num[], int res, int pos);
int main()
{
  char card[10];
  int num[4];
  int joker_exist = 0;
  int i;
  for (i = 0; i < 4; i++)
  {
    scanf("%s", card);
    if (strstr(card, "joker") != NULL || strstr(card, "JOKER") != NULL)
      joker_exist = 1;
    else if (strstr(card, "10") != NULL)
      num[i] = 10;
    else if (card[0] == 'J')
      num[i] = 11;
    else if (card[0] == 'Q')
      num[i] = 12;
    else if (card[0] == 'K')
      num[i] = 13;
    else if (card[0] == 'A')
      num[i] = 1;
    else if (card[0] >= '0' && card[0] <= '9')
      num[i] = card[0] - '0';
  }

  int res = 0;
  int pos = 0;
  compute(num, res, pos);
  
  if (joker_exist == 1)
  {
    printf("ERROR\n");
  }
  else if (flag == 0)
  {
    printf("NONE\n");
  }
  else if (flag == 1)
  {
    //cal_num
    char res_card[4] = {'\0'};
    for (int i = 0; i < 4; i++)
    {
      switch (cal_num[i])
      {
      case 11:
        res_card[i] = 'J';
        break;
      case 12:
        res_card[i] = 'Q';
        break;
      case 13:
        res_card[i] = 'K';
        break;
      case 1:
        res_card[i] = 'A';
        break;
      default:
        res_card[i] = cal_num[i] + '0';
        break;
      }
    }
    printf("%c", res_card[0]);
    for (int i = 1; i < 4; i++)
    {
      printf("%c%c", cal_signal[i], res_card[i]);
    }
  }

  return 0;
}

//pos 计算到哪一个数 0 -3
void compute(int num[], int res, int pos)
{
  if (pos == 4)
  {
    if (res == 24)
      flag = 1;
    else
      flag = 0;
    return;
  }

  for (int i = 0; i < 4; i++)
  {
    if (used[i] == 0)
    {
      if (pos == 0)
      {
        used[i]++;
        res += num[i];
        cal_num[pos] = num[i];
        compute(num, res, pos + 1);
        if (flag == 1)
          break;
        res -= num[i];
        used[i]--;
      }
      else
      {
        used[i]++;
        res += num[i];
        cal_num[pos] = num[i];
        cal_signal[pos] = '+';
        compute(num, res, pos + 1);
        if (flag == 1)
          break;
        res -= num[i];
        used[i]--;

        used[i]++;
        res -= num[i];
        cal_num[pos] = num[i];
        cal_signal[pos] = '-';
        compute(num, res, pos + 1);
        if (flag == 1)
          break;
        res += num[i];
        used[i]--;

        used[i]++;
        res *= num[i];
        cal_num[pos] = num[i];
        cal_signal[pos] = '*';
        compute(num, res, pos + 1);
        if (flag == 1)
          break;
        res /= num[i];
        used[i]--;

        used[i]++;
        int temp = res;
        res /= num[i];
        cal_num[pos] = num[i];
        cal_signal[pos] = '/';
        compute(num, res, pos + 1);
        if (flag == 1)
          break;
        res = temp;
        used[i]--;
      }
    }
  }
}

C 解法, 执行用时: 2ms, 内存消耗: 332KB, 提交时间: 2022-02-09

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char face[14][2]={"0","A","2","3","4","5","6","7","8","9","10","J","Q","K"};
char sign[3];
char signal[4]={'+','-','*','/'};
int n=0;
char cal(int a[4]){
    float out;
    int i,j,k,m;
    for(i=0;i<4;i++){
        sign[0]=i;
        for(j=0;j<4;j++){
            sign[1]=j;
            for(k=0;k<4;k++){
                sign[2]=k;
                out=a[0];
                for(m=0;m<3;m++){
                    if(sign[m]==2)
                        out*=a[m+1];
                    else if(sign[m]==3)
                        out/=a[m+1];
                    else if(sign[m]==1)
                        out-=a[m+1];
                    else
                        out+=a[m+1];
                }
                if(out-24<0.01&&out-24>-0.01){
                    printf("%s%c%s%c%s%c%s\n",face[a[0]],signal[sign[0]],face[a[1]],signal[sign[1]],face[a[2]],signal[sign[2]],face[a[3]]);
                    return 1;
                }
            }
        }
    }
    return 0;
}

void swap(int *a,int *b){
    int m;
    m=*a;
    *a=*b;
    *b=m;
}

int find_24(int a[],int k,int m){
    int i;
    if(k>m){
        if(cal(a))
            return 1;
        n++;
    }else{
        for(i=k;i<=m;i++){
            swap(&a[k],&a[i]);
            if(find_24(a,k+1,m))
                return 1;
            swap(&a[k],&a[i]);
        }
    }
    return 0;
}

int main(){
    int card[100];
    card['A'-'1']=1;
    card[1]=2;card[2]=3;card[3]=4;card[4]=5;
    card[5]=6;card[6]=7;card[7]=8;card[8]=9;
    card['1'-'1']=10;
    card['J'-'1']=11;card['Q'-'1']=12;card['K'-'1']=13;
    char A[6],B[6],C[6],D[6];
    while(scanf("%s %s %s %s",A,B,C,D)!=EOF){
        int a[4];
        if(strlen(A)>2||strlen(B)>2||strlen(C)>2||strlen(D)>2)
            printf("ERROR\n");
        else{
            a[0]=card[A[0]-'1'];
            a[1]=card[B[0]-'1'];
            a[2]=card[C[0]-'1'];
            a[3]=card[D[0]-'1'];
            char flag[4]={0};
            if(find_24(a,0,3));
            else{
                printf("NONE\n");
            }
        }
    }
    return 0;
}

上一题