日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

最近閑來無事,突然懷念起小時候和堂兄表姐們經常玩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點算法實現

 

分享到:
標簽:算法
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定