24點遊戲是一種益智遊戲,24點是把4個整數(一般是正整數)通過加減乘除以及括號運算,使最後的計算結果是24的乙個數學遊戲. 平時我也經常這樣玩這個遊戲,經常是在算出乙個結果之後就結束了,後來就在想, 有的題目結果只有乙個 ,但是大部分的結果通常是不止乙個, 怎麼列出所有的解呢, 在用腦子算 肯定是不全的 , 那就試試窮舉法吧.
窮舉法,思路上比較簡單,
先把所有可能的數字組合列出來, 4*3*2*1總共有24種,
在處理符號的, 由於符號有優先順序和括號,如果考慮括號的情況就比較多了,沒有括號,1個括號,2個括號的情況.所以就不太想處理括號,所以對所有的符號進行全排列,然後按照排列順序處理,不考慮符號間的優先順序. 加減乘除,總共需要3個符號, 4*4*4有64種組合.
當然這是最初的想法, 回來在寫測試用例的時候,發現了一種情況6,11,10,12 , 這種只有10/(11-6)*12, 這種必須有括號, 但是我又不想加括號, 就又加入了一種符號, 注意了10除以5是10/5 , 但是10除5 是5/10, 有了這種符號就可以處理這種情況了. 所以符號的全排列是 5*5*5=125種,
現在用24種陣列組合和125種符號組合,相互疊加處理, 算出來的就是所有可能的解了.
還有乙個, 用oc簡單的封裝了乙個棧的資料結構
#import @inte***ce stack : nsobject@property (nonatomic,readonly,assign) nsuinteger count ;
- (void)push:(id)obj;
- (id)pop;
@end
------------------------
#import "stack.h"
@inte***ce stack ()
@property (nonatomic,strong) nsmutablearray * array ;
@end
@implementation stack
- (nsuinteger)count
- (void)push:(id)obj
- (id)pop
- (nsmutablearray *)array
return _array;
}- (nsstring *)description
return str;
}- (id)copywithzone:(nullable nszone *)zone
@end
演算法的主體部分
#import "viewcontroller.h"
#import "stack.h"
@inte***ce viewcontroller ()
@property (nonatomic,strong) nsmutablearray * resultarray ;
@end
@implementation viewcontroller
- (void)test ;
int a[4] = ;
nsarray * nums = [self getnums:a];
for (int i = 0; i1) else if ([symbol isequaltostring:@"-"]) else if ([symbol isequaltostring:@"*"]) else if ([symbol isequaltostring:@"/"]) else if ([symbol isequaltostring:@"#"])
}double result = [[nums pop] doublevalue];
nslog(@"%@ %@ = %@",numstack,symbolstack,@(result));
if (result == 24)
return result;
}/// 返回數字的全排列
- (nsarray *)getnums:(int *)a
for (int k = 0; k<4; k++)
for (int m=0; m<4; m++)
// 如果i,j,k,m4個數字各不相等,說明是一種組合,記錄下來
nslog(@"%d %d %d %d",a[i],a[j],a[k],a[m]);
stack * stack = [stack new];
[stack push:@(a[i])];
[stack push:@(a[j])];
[stack push:@(a[k])];
[stack push:@(a[m])];
[result addobject:stack];}}
}}
return result;
}/// 獲取符號的全排列
- (nsarray *)getsymbol }}
return result;
}- (nsmutablearray *)resultarray
return _resultarray;
}@end
24點遊戲(窮舉法)
三 include include double cal double a,double b,int op op 0 1 2 3 if b 0.0 分母為0 return 999.0 else return a b bool isequal double d1,double d2 兩個浮點數是否近似...
窮舉法求解24點
看到網上更多的是推薦使用遞迴,但是自己對遞迴一向有點頭疼,所有使用窮舉法求解。vs2005下測試通過。1 2使用窮舉法求解24點。3但是仍然有乙個問題 對於1 2與2 1,因為順序的關係,4系統仍然認為其是兩個解,此問題尚待解決。5author chris 6date 2013 06 18 7 8 ...
24點問題(窮舉法 C )
算24點 point24 問題描述 幾十年前全世界就流行一種數字遊戲,至今仍有人樂此不疲 在中國我們把這種遊戲稱為 算24點 您作為遊戲者將得到4個1 9之間的自然數作為運算元,而您的任務是對這4個運算元進行適當的算術運算,要求運算結果等於24。您可以使用的運算只有 您還可以使用 來改變運算順序。注...