您当前的位置:首页 > 电脑百科 > 程序开发 > 算法

java 24点算法实现

时间:2019-08-15 11:26:59  来源:  作者:

最近闲来无事,突然怀念起小时候和堂兄表姐们经常玩24点游戏,于是就琢磨着是不是开发一个Android/ target=_blank class=infotextkey>安卓手机版本。然后上网上一搜,发现已经被别人给开发烂了啊。不过这只能说明这个小游戏要想赚广告费很难了,但是拿来锻炼和在妹纸面前装逼还是很有价值的,嘿嘿,想到这里,我最终还是花了3天时间开发了一个小游戏出来。

 

算法实现

在网上试玩了一个flash的版本,发现还需要实现计算所有正确的结果,然后网上稍微百度了下思路,就开始自己实现了。我开始时大概的思路就是穷举出所有的数字和算式的排列组合,然后一一进行验算,中间碰到两个问题,

  1. 第一是计算顺序的问题,稍微思考一下,就会发现,+,*是不考虑先后顺序的,-,/是考虑先后顺序的,所以考虑计算顺序后每两个数都会有6种计算方法。而括号也会产生很多不同的情况。
  2. 第二是保存计算的表达式的问题,因为穷举完了,计算机是知道答案了,但是用户还是不知道啊,所以得想办法保存起来(这个问题开始时没注意,后来小花了点时间才完美解决的,后面会有说明)。

 

然后,具体怎样进行遍历才能做到既不重复又无遗漏呢? 我的思路是这样的,还是得利用递归来简化实现,虽然递归很耗资源,但是作为非acm大神,算法水平一般般的我来说,还是先从简单的角度考虑。一个算式,不管包不包括括号,都可以抽象成两个数的计算的叠加,因为每次单个运算都是拿两个数运算的。然后再通过递归,将计算的结果和其他的数重新做两个数的运算,一直递归到只剩下一个结果时,那么这个数就是这种计算方法得到的答案了,和24比较就可以了。

 

至于每一个运算轨迹得到的表达式该怎么保存呢?我的做法是用一个类封装起来,然后维护两个数组,一个是数字(这个数字既是用户输入的,也可以是两个或多个数运算得到的结果),另一个就是这个数对应的表达式(当这个数是用户输入的时候就是一个数字而已,当这个数字是运算的结果时就是算式)的字符串。

 

实现代码:

package net.yunstudio.p24.util;
import JAVA.util.ArrayList;
import java.util.HashSet;
import java.util.List;
import java.util.Random;
import java.util.Set;
import com.umeng.a.a.a.b.n;
public class Count24 {
 private List<String> answerList=new ArrayList<String>();
 public List<String> getAnswerList() {
 return answerList;
 }
 public static class Data{
 public float[] arr;
 public String expStr="";
 public String[] strs;
 public Data(){}
 public Data(int a,int b,int c,int d) {
 arr=new float[]{a,b,c,d};
 strs=new String[]{a+"",b+"",c+"",d+""};
 expStr=a+"";
 }
 public Data(int arr[]) {
 this.arr=new float[]{arr[0],arr[1],arr[2],arr[3]};
 this.strs=new String[]{arr[0]+"",arr[1]+"",arr[2]+"",arr[3]+""};
 }
 }
 public void count(Data data){
 float[] arr=data.arr;
 if(arr.length<=1){
 if(arr.length==1&&arr[0]==24){
 answerList.add(data.expStr.substring(1, data.expStr.length()-1));
 }
 return ;
 }
 for(int i=0,len=arr.length;i<len-1; i++){
 for(int j=i+1;j<len;j++){
 float x=arr[i];
 float y=arr[j];
 String xs=data.strs[i];
 String ys=data.strs[j];
 for(int k=0;k<6;k++){
 Data newData=getNewArr(data,i);
 switch(k){
 case 0:
 newData.arr[j-1]=x+y;
 newData.expStr=xs+"+"+ys;
 break;
 case 1:
 newData.arr[j-1]=x-y;
 newData.expStr=xs+"-"+ys;
 break;
 case 2:
 newData.arr[j-1]=y-x;
 newData.expStr=ys+"-"+xs;
 break;
 case 3:
 newData.arr[j-1]=x*y;
 newData.expStr=xs+"*"+ys;
 break;
 case 4:
 if(y!=0){
 newData.arr[j-1]=x/y;
 newData.expStr=xs+"/"+ys;
 }else {
 continue;
 }
 break;
 case 5:
 if(x!=0){
 newData.arr[j-1]=y/x;
 newData.expStr=ys+"/"+xs;
 }else {
 continue;
 }
 break;
 }
 newData.expStr="("+newData.expStr+")";
 newData.strs[j-1]=newData.expStr;
 count(newData);
 }
 }
 }
 
 }
 private static Data getNewArr(Data data, int i) {
 Data newData=new Data();
 newData.expStr=data.expStr;
 newData.arr=new float[data.arr.length-1];
 newData.strs=new String[data.arr.length-1];
 for(int m=0,len=data.arr.length,n=0;m<len;m++){
 if(m!=i){
 newData.arr[n]=data.arr[m];
 newData.strs[n]=data.strs[m];
 n++;
 }
 }
 return newData;
 }
 
 public static final List<String> easyCount(int[] curRandNums){
 Count24 count24=new Count24();
 count24.count(new Data(curRandNums));
 Set<String> set=new HashSet<String>(count24.getAnswerList());//去重
 return new ArrayList<String>(set);
 }
 
 public static void main(String[] args) throws InterruptedException {
 long start=System.currentTimeMillis();
 List<String> answerStris=easyCount(new int[]{1,2,3,4});
 System.out.println(System.currentTimeMillis()-start);
 for (String string : answerStris) {
 System.out.println(string);
 }
 }
}

在电脑上面(神舟i7)大概需要60ms,这个速度初看还是可以接受的,但是到了手机上,居然需要6秒以上!!不过无意中发现,在android系统中对大量运算有优化,貌似计算了一定次数之后系统会缓存编译后的本地代码,然后手机上也可以像电脑上一样秒算了。

 

之后又花了一天做了个丑陋无比的简单界面,再花了一天时间加上积分功能,修复各种bug,添加广告和统计sdk,上传应用市场。。

 

java 24点算法实现

 



Tags:算法   点击:()  评论:()
声明:本站部分内容及图片来自互联网,转载是出于传递更多信息之目的,内容观点仅代表作者本人,如有任何标注错误或版权侵犯请与我们联系(Email:2595517585@qq.com),我们将及时更正、删除,谢谢。
▌相关推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Tags: 算法  点击:(1)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  Tags: 算法  点击:(7)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15  Tags: 算法  点击:(16)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯&middot;奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  Tags: 算法  点击:(24)  评论:(0)  加入收藏
基于算法的业务或者说AI的应用在这几年发展得很快。但是,在实际应用的场景中,我们经常会遇到一些非常奇怪的偏差现象。例如,Facebook将黑人标记为灵长类动物、城市图像识别系统...【详细内容】
2021-11-08  Tags: 算法  点击:(32)  评论:(0)  加入收藏
随着注册制的加速推进,新股越来越多,截止到今天A股上市公司的总数高达4500余家,A股一直就是重融资,轻投资的市场,而上市公司发行可转债这种再融资的(圈钱方式)是最能让普通投资者接...【详细内容】
2021-11-05  Tags: 算法  点击:(98)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  Tags: 算法  点击:(40)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  Tags: 算法  点击:(36)  评论:(0)  加入收藏
每个人都有过这样的经历:打开手机准备回消息或打电话,一看到微信图标右上方的小红点,于是忍不住先打开微信;看完微信,不知不觉又被另一个App牵引,直到关闭手机屏幕才发现自己早已...【详细内容】
2021-11-03  Tags: 算法  点击:(30)  评论:(0)  加入收藏
文丨互联网怪盗团在互联网行业,尤其是在投资人心目中,往往存在一种“算法迷信”或曰“技术迷信”:某公司的广告变现做得好,一定是因为有算法;某公司的云计算业务开展的好,也是因为...【详细内容】
2021-11-03  Tags: 算法  点击:(25)  评论:(0)  加入收藏
▌简易百科推荐
前言Kafka 中有很多延时操作,比如对于耗时的网络请求(比如 Produce 是等待 ISR 副本复制成功)会被封装成 DelayOperation 进行延迟处理操作,防止阻塞 Kafka请求处理线程。Kafka...【详细内容】
2021-12-27  Java技术那些事    Tags:时间轮   点击:(1)  评论:(0)  加入收藏
博雯 发自 凹非寺量子位 报道 | 公众号 QbitAI在炼丹过程中,为了减少训练所需资源,MLer有时会将大型复杂的大模型“蒸馏”为较小的模型,同时还要保证与压缩前相当的结果。这就...【详细内容】
2021-12-24  量子位    Tags:蒸馏法   点击:(11)  评论:(0)  加入收藏
分稀疏重建和稠密重建两类:稀疏重建:使用RGB相机SLAMOrb-slam,Orb-slam2,orb-slam3:工程地址在: http://webdiis.unizar.es/~raulmur/orbslam/ DSO(Direct Sparse Odometry)因为...【详细内容】
2021-12-23  老师明明可以靠颜值    Tags:算法   点击:(7)  评论:(0)  加入收藏
1. 基本概念希尔排序又叫递减增量排序算法,它是在直接插入排序算法的基础上进行改进而来的,综合来说它的效率肯定是要高于直接插入排序算法的;希尔排序是一种不稳定的排序算法...【详细内容】
2021-12-22  青石野草    Tags:希尔排序   点击:(6)  评论:(0)  加入收藏
ROP是一种技巧,我们对execve函数进行拼凑来进行system /bin/sh。栈迁移的特征是溢出0x10个字符,在本次getshell中,还碰到了如何利用printf函数来进行canary的泄露。ROP+栈迁移...【详细内容】
2021-12-15  星云博创    Tags:栈迁移   点击:(22)  评论:(0)  加入收藏
一、什么是冒泡排序1.1、文字描述冒泡排序是一种简单的排序算法。它重复地走访要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地...【详细内容】
2021-12-15    晓掌柜丶韶华  Tags:排序算法   点击:(16)  评论:(0)  加入收藏
在了解golang的map之前,我们需要了解哈希这个概念。哈希表,又称散列表(Hash table),是根据键(key)而直接访问在内存储存位置的数据结构。也就是说,它通过计算出一个键值的函数,将...【详细内容】
2021-12-07  一棵梧桐木    Tags:哈希表   点击:(14)  评论:(0)  加入收藏
前面文章在谈论分布式唯一ID生成的时候,有提到雪花算法,这一次,我们详细点讲解,只讲它。SnowFlake算法据国家大气研究中心的查尔斯&middot;奈特称,一般的雪花大约由10^19个水分子...【详细内容】
2021-11-17  小心程序猿QAQ    Tags:雪花算法   点击:(24)  评论:(0)  加入收藏
导读:在大数据时代,对复杂数据结构中的各数据项进行有效的排序和查找的能力非常重要,因为很多现代算法都需要用到它。在为数据恰当选择排序和查找策略时,需要根据数据的规模和类型进行判断。尽管不同策略最终得到的结果完...【详细内容】
2021-11-04  华章科技    Tags:排序算法   点击:(40)  评论:(0)  加入收藏
这是我在网上找的资源的一个总结,会先给出一个我看了觉得还行的关于算法的讲解,再配上实现的代码: Original author: Bill_Hoo Original Address: http://blog.sina.com.cn/s/bl...【详细内容】
2021-11-04  有AI野心的电工和码农    Tags: KMP算法   点击:(36)  评论:(0)  加入收藏
最新更新
栏目热门
栏目头条