演算法29 速算24

2022-07-05 16:00:13 字數 2983 閱讀 4235

給定四個數字a, b, c, d,取值範圍為[1, 13];新增合適的運算子 + , - , * , /, 和括號(, )使得表示式等於24,給出一種可能的表示式方案;如果不可能則返回-1。

例如:輸入2, 3, 12, 12, 輸出 ((3-2)*12) + 12.

輸入5, 5, 5, 2, 輸出-1.

這個題目似乎沒有好的演算法,只能暴力搜尋。

首先對於所有給個數字進行全排列,總過有$a_4^4 = 24$中排列方式;

然後對於每一種排列方式,需要新增三個運算子,每個運算子有加減乘除四種選擇,總共有$4*4*4 = 64$中可能

最後對於得到的表示式進行加括號以改變優先順序,總共只有5種加括號的方式:

因而所有可能的情況有 $24 * 64 * 5 = 7680$種選擇。

定義子函式int calcluatebinaryexpression(int a, int b, char op) 來計算 a op b 的值;主函式首先do{}while(next_permutation)以獲得所有的全排列過程,對於每個排列a, b, c, d,對於每一種加括號方式按照括號優先順序計算表示式的值,判斷是否等於24, 如果等於,直接return,否則,判斷下一種加括號的方式。

注意:對於op == '/', a / b 時,需要保證b != 0 && a % b == 0。如果不滿足該條件,則直接進行下一輪迴圈。

1 #include 2 #include 

3 #include 4 #include 5 #include 6 #include 7 #include 8 #include 9

using

namespace

std;

1011

//given number a, b and operator ch, return eval(a ch b)

12int calculatebinaryexpression(int a, int b, char

ch)1334}

3536

//make 24 game

37//

basic idea: permutation all the possible cases: a(4, 4) = 24;

38//

need 3 operators: 4 * 4 * 4 = 64;

39//

all five possible adding parenthese:

40//

(1) (a @ b) @ (c @ d)

41//

(2) (a @ (b @ c) ) @ d

42//

(3) ( (a @ b) @ c) @ d

43//

(4) a @ ( ( b @ c) @ d)

44//

(5) a @ ( b @ (c @ d) )

45//

total possible cases: 24 * 64 * 5 = 7680, brute force

46//

input: 4 numbers in [1, 13],

47//

use '+','-','*','/' and '(',')' to make 24

48//

output: if it is possible to make 24, output the expression

49//

else return -1;

50//

notice: when calcalute x / y, need to assert (y != 0 && x % y == 0)

51//

if not, continue

52string make24(int num1, int num2, int num3, int

num4)

5399

}100

}101

102}

103104

//the second parethesis

105//

(a op2 (b op1 c)) op3 d

106for (size_t i = 0; i < ops.size(); ++i)

107137

}138

}139

}140

141//

the third parentheses

142//

( ( a op1 b) op2 c) op3 d

143for (size_t i = 0; i < ops.size(); ++i)

144172

}173

}174

}175

176//

the fourth parentheses

177//

a op3 ( ( b op1 c ) op2 d)

178for (size_t i = 0; i < ops.size(); ++i)

179208

}209

}210

}211

212//

the fifth parenthese

213//

a op3 ( b op2 ( c op1 d) );

214for (size_t i = 0; i < ops.size(); ++i)

215244

}245

}246

}247

248 } while

(next_permutation(v.begin(), v.end()));

249250

return"-1

";251}

252253

intmain()

254

[1] 速算24演算法思路

[2] 24 game/countdown/number game solver, but without parentheses in the answer

速算24 演算法思路

給定任意4個自然數,請給出通過4則運算,使結果為24的演算法,並且每個數在算式中使用一次。如果無法通過上述規則得到24,則輸出 無法計算得到24 如果給出4個數為2 3 4 5,程式的輸出結果應是乙個表示式 5 3 2 4 如果給出的4個數是1 1 1 1,程式的輸出結果應該是 無法計算得到24 要...

iOS 快速演算法

設要排序的陣列是mutablearray物件,首先任意選取乙個資料 通常選用陣列的第乙個數 作為關鍵資料,然後將所有比它小的數都放到它前面,所有比它大的數都放到它後面,這個過程稱為一次快速排序。步驟講解 1 設定兩個變數i,j,排序開始時i 0,就j mutablearray.count 1 2 設...

均值濾波快速演算法

1 概述 在影象處理中,在進行如邊緣檢測這樣的進一步處理之前,通常需要首先進行一定程度的降噪。中值濾波是一種非線性數字濾波器技術,經常用於去除影象或者其它訊號中的雜訊。這個設計思想就是 檢查輸入訊號中的取樣並判斷它是否代表了訊號,使用奇數個取樣 組成的觀察窗實現這項功能。觀察窗口中的數值進行 排序,...