首页 > 试题广场 >

24点运算

[编程题]24点运算
  • 热度指数:87683 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解

计算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   
将24种顺序配置成数组,取出的值split成四份就是四个坐标,四个数需要三个操作符,三层for循环去遍历,每一层利用eval去品字符串执行代码。小数问题,只要误差在一定范围内就考虑成立。一旦遇到成立的数字立马停止遍历。返回对应的算数表达式
发表于 2020-12-24 20:51:50 回复(0)
while( text=readline()){
    const cards=text.split(' ')
    var flag;
    for(var i in cards){
        if(cards[i].length>2){
            flag='ERROR'
        }
    }
    function calc(n1,t,n2){
        if(t=='+'){
            return n1+n2
        }else if(t=='-'){
            return n1-n2
        }else if(t=='/'){
            return n1/n2
        }else if(t=='*'){
            return n1*n2
        }
    }
    //ark和comb是求数组的全排列数组的递归函数:ark([1,2])=>[[1,2],[2,1]]
    function ark(lis){
        if(lis.length==1){
            return [lis]
        }else{
            return comb(lis[lis.length-1],ark(lis.slice(0,lis.length-1)))
        }
    }
    function comb(x,li){
        var result=[]
        for(var i in li){
            for (var j=0;j<=li[0].length;j++){
                result.push(li[i].slice(0,j).concat([x],li[i].slice(j)))
            }
        }
        return result
    }
    //replaceAll竟然不能用,一气之下就改成这么多replace了。
    if(flag!='ERROR'){
        var cl=cards.join(' ').replace('A','1').replace("J",'11').replace("Q",'12').replace("K",'13').replace('A','1').replace("J",'11').replace("Q",'12').replace("K",'13').replace('A','1').replace("J",'11').replace("Q",'12').replace("K",'13').replace('A','1').replace("J",'11').replace("Q",'12').replace("K",'13').split(' ');
        var ncl=[]
        for(var i in cl){
            ncl.push(parseInt(cl[i]))
        };
    const ncls=ark(ncl)
const ct=['+','-','*','/'];
for(var a in ncls){
    for(var x in ct){
        for(var y in ct){
            for(var z in ct){
                if ((calc(calc(calc(ncls[a][0],ct[x],ncls[a][1]),ct[y],ncls[a][2]),ct[z],ncls[a][3])==24)){
                    flag=' '+ncls[a][0]+' '+ct[x]+' '+ncls[a][1]+' '+ct[y]+' '+ncls[a][2]+' '+ct[z]+' '+ncls[a][3]+' ';
                    flag=(flag+' ').replace(' 13 ','K').replace(' 12 ','Q').replace(' 11 ','J').replace(' 1 ','A').replace(' 13 ','K').replace(' 12 ','Q').replace(' 11 ','J').replace(' 1 ','A').replace(' 13 ','K').replace(' 12 ','Q').replace(' 11 ','J').replace(' 1 ','A').replace(' 13 ','K').replace(' 12 ','Q').replace(' 11 ','J').replace(' 1 ','A').replace(' ','').replace(' ','').replace(' ','').replace(' ','').replace(' ','').replace(' ','').replace(' ','').replace(' ','')
                    break
                }
            }
        }
    }
}}
    if(flag==undefined){
        flag='NONE'
    }
    console.log(flag)}
发表于 2020-12-03 12:41:41 回复(0)
javascript  回溯
let str = "1 2 3 4";
let temp = ["+", "-", "*", "/"];
while ((str = readline())) {
  function test(str, current, target, arr, indexArr, count) {
    if (count == arr.length) {
      if (current == target) {
        return str;
      } else {
        return false;
      }
    } else if (count < arr.length) {
      let re = false;
      for (let i = 0; i < indexArr.length; i++) {
        if (!indexArr[i]) {
          indexArr[i] = 1;
          if (count == 0) {
            re =
              re ||
              test(arr[i], transfer(arr[i]), target, arr, indexArr, count + 1);
          } else {
            for (let j = 0; j < 4; j++) {
              let last = current;
              switch (j) {
                case 0:
                  last += transfer(arr[i]);
                  break;
                case 1:
                  last -= transfer(arr[i]);
                  break;
                case 2:
                  last *= transfer(arr[i]);
                  break;
                case 3:
                  last /= transfer(arr[i]);
                  break;
              }
              re =
                re ||
                test(
                  str + temp[j] + arr[i],
                  last,
                  target,
                  arr,
                  indexArr,
                  count + 1
                );
            }
          }
          indexArr[i] = 0;
        }
      }
      return re;
    }
  }
  function transfer(it) {
    switch (it) {
      case "J":
        return 11;
      case "Q":
        return 12;
      case "K":
        return 13;
      case "A":
        return 1;
      default:
        return Number(it);
    }
  }
  let flag = true;
  str = str.split(" ").map((it) => {
    if (it == "joker" || it == "JOKER") {
      flag = false;
    }
    return it;
  });
  if (flag) {
    let re = test("", 0, 24, str, Array(str.length), 0);
    if (!re) {
      console.log("NONE");
    } else {
      console.log(re);
    }
  } else {
    console.log("ERROR");
  }
}

发表于 2020-10-25 13:26:39 回复(0)
我已经尽力了,不知道这个系统是怎么判断的,通过率只到了80%   也看不了测试用例
😅😅😅😅😅😅😅😅😅😅😅😅😅😅😅😅😅😅😅😅😅😅😅😅😅😅😅😅😅😅😅😅😅
function f6(arr){
    /* 大小王返回Error */
    if(arr.indexOf('joker')!=-1||arr.indexOf('joker')!=-1||arr.length!=4) return 'ERROR'

    let computed = ['+','-','*','/']
    let com_arr = [] //存放计算符号穷举值

    /*输入值*/
    let data  = arr
    let data_arr = []  //存放数组穷举值

    /*穷举所有可能 存在重复  长度为三*/
    for (let i in computed){
        for (let j in computed){
            for (let l in computed){
                 com_arr.push([computed[i],computed[j],computed[l]])
            }
        }
    }
    //穷举所有数字组合数据 有重复
    for (let i in data){
        for (let j in data){
            for (let l in data){
                for (let k in data){
                    data_arr.push([data[i],data[j],data[l],data[k]])
                }
            }
        }
    }

    /*去重复*/
    let new_data = []
    for (let i in data_arr){
        let set = new Set(data_arr[i])
        let res = [...set]
        if(res.length == data.length){
            new_data.push(data_arr[i])
        }
    }

    // 计算结果集
    let result = []
   for (let i in com_arr){
        for (let k in new_data){
            if(eval(`((${com_str(new_data[k][0])}${com_arr[i][0]}${com_str(new_data[k][1])})${com_arr[i][1]}${com_str(new_data[k][2])})${com_arr[i][2]}${com_str(new_data[k][3])}`) == 24){
                result.push(`${new_data[k][0]}${com_arr[i][0]}${new_data[k][1]}${com_arr[i][1]}${new_data[k][2]}${com_arr[i][2]}${new_data[k][3]}`)
            }
        }
    }

    // 转换权重值
    function com_str(str){
        let num = str
        switch (str) {
            case 'J':
                num = 11
                break
            case 'Q':
                num = 12
                break
            case 'K':
                num = 13
                break
            case 'A':
                num = 1
                break
        }
        return Number(num)
    }
    // 返回结果
    if(result.length) {
        return result[0]
    }else{
        return 'NONE'
    }
}

while(line=readline()){
    let lines = line.split(' ');
    print(f6(lines));
}


发表于 2020-07-29 11:34:41 回复(1)
 11
                                                                                    
发表于 2018-06-30 19:53:41 回复(0)