使用窮舉法計算24點

2021-10-04 02:09:06 字數 2500 閱讀 3239

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。您可以使用的運算只有 您還可以使用 來改變運算順序。注...