基于Python3.0的实现24点计算

本文深入探讨了一种解决经典24点游戏的算法,通过详细的代码实现,展示了如何使用递归和组合策略来寻找四张牌通过加减乘除运算达到24的方法。文章覆盖了算术运算符的优先级处理、括号生成策略以及输入验证等关键环节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

直接上代码

global count
count=0

def cal(arr):
    p=0
    addsub=0
    muldiv=0
    muldivindex=0
    while arr.find('sqrt')>=0:
        arr=cal_sqrt(arr)
    while arr.find('^')>=0:
        arr=cal_power(arr)
        

    for i in range(len(arr)-1,-1,-1):
        if arr[i]=="(":
            p+=1
        elif arr[i]==")":
            p-=1
        elif (arr[i]=="+" or arr[i]=="-") and p==0:
            addsub+=1
            break
        elif (arr[i]=="*" or arr[i]=="/") and p==0 and muldiv==0:
            muldiv=+1
            muldivindex=i
    if p==0 and addsub==0 and muldiv==0 and arr[0]=="(" and arr[len(arr)-1]==")":
        return cal(arr[1:len(arr)-1])
    if p==0 and arr.find('+')==-1 and arr.find('-')==-1 and arr.find('*')==-1 and arr.find('/')==-1:
        return float(arr)
    if addsub!=0:
        if arr[i]=="+":
            return cal(arr[0:i])+cal(arr[i+1:len(arr)])
        elif arr[i]=="-":
            return cal(arr[0:i])-cal(arr[i+1:len(arr)])
    if muldiv!=0:
        if arr[muldivindex]=="*":
            return cal(arr[0:muldivindex])*cal(arr[muldivindex+1:len(arr)])
        elif arr[muldivindex]=="/":
            if cal(arr[muldivindex+1:len(arr)])==0:
                return 60000
            else:
                return cal(arr[0:muldivindex])/cal(arr[muldivindex+1:len(arr)])

def build_card(card):
    arr_card=[0,"+",0,"+",0,"+",0]
    for i in range(4):
        arr_card[0]=card[i]
        for j in range(4):
            if j!=i:
                arr_card[2]=card[j]
                for k in range(4):
                    if k!=j and k!=i:
                        arr_card[4]=card[k]
                        for l in range(4):
                            if l!=k and l!=j and l!=i:
                                arr_card[6]=card[l]
                                build_sign(arr_card)
                                


def build_sign(card_sign):
    sign=["+","-","*","/"]
    arr_sign=card_sign
    for i in range(4):
        arr_sign[1]=sign[i]
        for j in range(4):
            arr_sign[3]=sign[j]
            for k in range(4):
                arr_sign[5]=sign[k]
                build_brackets(arr_sign)


def build_brackets(card_brackets):
    s=""
    a=0
    global count
    arr=list(card_brackets)
    for i in range(11):
        if i==0:
            arr[0]="("+str(arr[0])
            arr[2]=str(arr[2])+")"
        elif i==1:
            arr[2]="("+str(arr[2])
            arr[4]=str(arr[4])+")"
        elif i==2:
            arr[4]="("+str(arr[4])
            arr[6]=str(arr[6])+")"
        elif i==3:
            arr[0]="("+str(arr[0])
            arr[2]=str(arr[2])+")"
            arr[4]="("+str(arr[4])
            arr[6]=str(arr[6])+")"
        elif i==4:
            arr[0]="("+str(arr[0])
            arr[4]=str(arr[4])+")"
        elif i==5:
            arr[2]="("+str(arr[2])
            arr[6]=str(arr[6])+")"
        elif i==6:
            arr[0]="("+"("+str(arr[0])
            arr[2]=str(arr[2])+")"
            arr[4]=str(arr[4])+")"
        elif i==7:
            arr[0]="("+str(arr[0])
            arr[2]="("+str(arr[2])
            arr[4]=str(arr[4])+")"+")"
        elif i==8:
            arr[2]="("+"("+str(arr[2])
            arr[4]=str(arr[4])+")"
            arr[6]=str(arr[6])+")"
        elif i==9:
            arr[2]="("+str(arr[2])
            arr[4]="("+str(arr[4])
            arr[6]=str(arr[6])+")"+")"
        s=""
        for j in range(len(arr)):
            s+=str(arr[j])
        a=cal(s)
        if a==24:
            count=1
            print(s)
        arr=list(card_brackets)

        

import sys
card=[0,0,0,0]
s=""
for i in range(4):
     s=input("输入卡牌"+str(i+1)+"的值(1-13,不能0开头):")
     while s.isdigit()==0:
        s=input("输入错误,重新输入卡牌"+str(i+1)+"的值(1-13,不能0开头):")
     card[i]=int(s)   
     while (card[i]<1 or card[i]>13):
         card[i]=int(input("输入错误,重新输入卡牌"+str(i+1)+"的值(1-13,不能0开头):"))
build_card(card)
if count==0:print("无解")








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值