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