24点游戏的算法实现

根据要求实现一个24点的游戏算法,要求如下:

输入:n1,n2,m1,m2

如果这个四个数的运算结果是24,则输出运算表达式

如11,8,3,5

输出:(11-8)*(3*5)=24

解法一:蛮力法,遍历所有的表达式组合,首先遍历所有的数字的排列组合,然后遍历运算符的组合,然后计算出

这个表达式的值,看其是否等于24

测试输入:

5,5,5,1 3,3,7,73,3,8,81,4,5,6

3,8,8,10 4,,410,10 9,9,6,2 11,8,3,5

#---*--- encoding=utf8 ---*---
'''
Created on 2015-1-4

@author: demaxiya
'''
from __future__ import division #实现除法的真除,比如3/8=是一个小数,而不是0
import itertools   #实现排列组合的工具函数

def game24_force(arr,n,result_dic={}):
    '''
        24点游戏的蛮力法
                        输入一个数字字符数组,输出与n值相等的表达式
    '''
    result_dic=result_dic
#    数组的长度大于等于2,则进一步分解,如果小于2则输出组合的表达式
    if len(arr)<2:
        if len(arr)>0 and round(eval(arr[0]),1)==n:
            if arr[0] not in result_dic:
                result_dic[arr[0]]=(arr[0])[1:-1]+" = "+str(n)
#            下面的注释是用于调试用的,可以用来打印出所有的组合的表达式
#         elif len(arr)>0 and arr[0]=='(8/(3-(8/3)))':
#             print round(eval(arr[0]),2),float(eval(arr[0])),round((eval(arr[0])))==n
        else:
            return result_dic
    elif len(arr)>=2:
        nums=itertools.permutations(arr,2)
        exp=('+','-','*','/')
        for num in nums:
            for item in exp:
                tmp='('+num[0]+item+num[1]+')'
                if item=='/' and float(eval(num[1]))==0.0:
                    continue
                arr.remove(num[0])
                arr.remove(num[1])
                arr.append(tmp)
                game24_force([item for item in arr],24)
                arr.remove(tmp)
                arr.append(num[0])
                arr.append(num[1])
#            在计算完子问题后,把之前移除的数给添加到原来的数组中
    return result_dic

if __name__ == '__main__':
    arr1=['5','5','5','1']
    arr2=['3','3','7','7']
    arr3=['9','9','2','6']
    arr4=['4','4','10','10']
    arr5=['3','8','8','10']
    arr6=['1','4','5','6']
    arr7=['3','3','8','8']
    arr8=['11','3','8','5']
    result_dic=game24_force(arr5,24)
    for item in result_dic.keys():
        print result_dic[item]
</pre><p></p><pre>

就是这个小程序,纠结了我一天的时间,首先是递归比较难理解和写程序,而且是python的写的递归,没能很快从C和C++中跳出来,

发现python传参数的时候,还是用

[item for item in arr]

这个好些,特别是递归程序。

还有就是发现一个神奇的问题,

from __future__ import division
xx=eval('8/(3-8/3)')
print int(xx)

这个的运行结果竟然是23,估计是int函数的取整导致的,直接舍去小数部分

而且float(xx)==float(24)的结果竟然是false,估计是float的小数的保留位数的原因

还有就是在递归程序中添加全局变量的话,通过默认参数来给,比如result_dic

用round函数来进行四舍五入,python比较时,24==24.00是为True的

话说这个小程序没有做异常处理的,我就懒得加的,如果有报错的话,自己根据报错信息改吧...

时间: 2024-10-08 23:02:13

24点游戏的算法实现的相关文章

C#实现的算24点游戏的算法的代码

下面资料是关于C#实现的算24点游戏的算法的内容,希望能对码农们有所用处. using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; namespace Calc24Points { public class Cell { public enum Type { Number, Signal } public int Number; public ch

[华为机试练习题]44.24点游戏算法

题目 注意: 6 + 2 * 4 + 10 = 24 不是一个数字一个数字的计算 代码 /*--------------------------------------- * 日期:2015-07-03 * 作者:SJF0115 * 题目:24点游戏算法 * 来源:华为机试练习题 -----------------------------------------*/ #include <iostream> #include <string> #include <vector&

24点游戏问题

24点游戏问题 标签(空格分隔): OJ_算法 1. 题目描述 问题描述:给出4个1-10的数字,通过加减乘除,得到数字为24就算胜利 输入:4个1-10的数字.[数字允许重复,测试用例保证无异常数字] 输出:True or False 2. 问题求解(穷举法) ??利用穷举法,列出所有可能的表达式,然后计算表达式的值,问题便求解. 此问题可以分解为两步: 1. 列出所有可能的表达式 2. 计算法表达式(四则混合运算)的值 2.1 列出所有可能的表达式 表达式由输出的四个数字(1~10).3个加

24点游戏

题目描述 给出4个正整数操作数,你的任务是使用运算符(+,-,*,/)和括号对操作数进行计算,分析是否能得到24,每个操作数只能使用1次,运算符和括号可以多次使用,注意所有的中间结果都是整数. 输入 输入包括多行,每行4个正整数,范围是[1,13],输入以0 0 0 0标记结束 输出 若输入的4个操作数能计算出24,输出Yes,否则输出No 样例输入 1 1 1 1 2 5 7 8 0 0 0 0 样例输出 No Yes #include<iostream>   #include<str

微信公众平台开发—24点游戏

一.源码 package org.xs.dntown.wx.game24.modules.web; import java.text.NumberFormat; import java.util.Arrays; import java.util.Date; import java.util.List; import java.util.Random; import javax.script.ScriptEngine; import javax.script.ScriptEngineManager

24点游戏(dfs)

24点游戏 Time Limit: 3000/1000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others) Submit Status 2424点就是给你一串数字,问你是否通过加减乘除括号构成2424点. 沈爷觉得这个很好玩,就决定考考你,给你44个数,可以交换位置,可以用加减乘除和括号,是否能构成2424点呢? 注意哦~这里的除法并不是整数除法,比如样例 Input 第一行TT,表示有多少组测试数据,1≤T≤501≤T≤5

cdoj 1252 24点游戏 dfs

24点游戏 Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.uestc.edu.cn/#/problem/show/1252 Description 24点就是给你一串数字,问你是否通过加减乘除括号构成24点. 沈爷觉得这个很好玩,就决定考考你,给你4个数,可以交换位置,可以用加减乘除和括号,是否能构成24点呢? 注意哦~这里的除法并不是整数除法,比如样例 Input 第一行T,表示有多少组测试数据,1≤T≤50 接下来T行,每行4

24点游戏计算器 (简单四则运算)(c++)

24点游戏计算器 (简单四则运算)(c++):https://github.com/liuxinig/cpp_1001/blob/master/24dian_siZeIN.txt 1 //24点统计 2 3 #include <iostream> 4 #include <cmath> 5 using namespace std; 6 #define N 14 7 //a数组存四个数字 8 int cixu[3],fuHao[3],p[N],sum = 0; 9 float a0[4

24点游戏计算器 (加、减、乘、除、阶乘、导数)(c++)

24点游戏计算器 (加.减.乘.除.阶乘.导数)(c++):https://github.com/liuxinig/cpp_1001/blob/master/24dian_fuZaIN.txt 1 //24点统计 2 3 #include <iostream> 4 #include <cmath> 5 using namespace std; 6 #define N 14 7 //a数组存四个数字 8 int cixu[3],fuHao[3],p[N],sum = 0; 9 flo