สมมติว่าเรามีไพ่สี่ใบ การ์ดเหล่านี้มีตัวเลขตั้งแต่ 1 ถึง 9 เราต้องตรวจสอบว่าสามารถทำงานผ่านโอเปอเรเตอร์บางตัวเช่น +, -, *, / เพื่อให้ได้ 24 หรือไม่ ดังนั้นหากเรามีตัวเลขเช่น [4,9,2,6 ] จากนั้นเราจะได้ 24 (4 * 9) – (2 * 6) คำตอบจะเป็นจริง
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
- epsilon :=10.0^-5
- กำหนดฟังก์ชัน Solve() ซึ่งจะใช้อาร์เรย์ v
- ถ้าขนาดของ v เท่ากับ 1 แล้ว −
- คืนค่าจริงเมื่อ |v[0] - 24.0| <=เอปซิลอน
- สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาด v อัปเดต (เพิ่ม i ขึ้น 1) ทำ −
- สำหรับการเริ่มต้น j :=0 เมื่อ j <ขนาดของ v อัปเดต (เพิ่ม j ขึ้น 1) ทำ −
- ถ้าฉันเหมือนกับ j แล้ว:ไม่ต้องสนใจส่วนต่อไปนี้ ข้ามไปที่การวนซ้ำถัดไป
- กำหนดความละเอียดของอาร์เรย์
- สำหรับการเริ่มต้น k :=0 เมื่อ k <ขนาดของ v อัปเดต (เพิ่ม k ขึ้น 1) ทำ −
- ถ้าฉันไม่เท่ากับ k และ j ไม่เท่ากับ k แล้ว −
- ใส่ v[k] ที่ท้าย res
- ถ้าฉันไม่เท่ากับ k และ j ไม่เท่ากับ k แล้ว −
- สำหรับการเริ่มต้น k :=0 เมื่อ k <4 อัปเดต (เพิ่ม k ขึ้น 1) ทำ −
- ถ้าตัวดำเนินการ[k] เหมือนกับ '+' แล้ว −
- ใส่ v[i] + v[j] ที่ส่วนท้ายของ res
- มิฉะนั้น เมื่อโอเปอเรเตอร์[k] เหมือนกับ '-' แล้ว −
- ใส่ v[i] - v[j] ที่ส่วนท้ายของ res
- มิฉะนั้น เมื่อตัวดำเนินการ[k] เหมือนกับ '*' แล้ว −
- ใส่ v[i] * v[j] ต่อท้าย res
- มิฉะนั้น
- ใส่ v[i] / v[j] ที่ส่วนท้ายของ res
- ถ้าแก้(res) แล้ว −
- คืนค่าจริง
- ลบองค์ประกอบสุดท้ายออกจาก res
- ถ้าตัวดำเนินการ[k] เหมือนกับ '+' แล้ว −
- สำหรับการเริ่มต้น j :=0 เมื่อ j <ขนาดของ v อัปเดต (เพิ่ม j ขึ้น 1) ทำ −
- คืนค่าเท็จ
- จากวิธีหลัก ให้ทำตามขั้นตอน -
- กำหนดอาร์เรย์ v
- สำหรับการเริ่มต้น i :=0 เมื่อ i <ขนาดของ nums อัปเดต (เพิ่ม i ขึ้น 1) ทำ −
- ใส่ nums[i] ต่อท้าย v
- ผลตอบแทนการแก้(v)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h>
using namespace std;
class Solution {
public:
char operators[4] = {'+', '-', '/', '*'};
double epsilon = pow(10.0, -5);
bool judgePoint24(vector<int>& nums) {
vector <double> v;
for(int i = 0; i < nums.size(); i++){
v.push_back(nums[i]);
}
return solve(v);
}
bool solve(vector <double> v){
if(v.size() == 1){
return abs(v[0] - 24.0) <= epsilon;
}
for(int i = 0; i < v.size(); i++){
for(int j = 0; j < v.size(); j++){
if(i == j) continue;
vector <double> res;
for(int k = 0; k < v.size(); k++){
if(i != k && j != k){
res.push_back(v[k]);
}
}
for(int k = 0; k < 4; k++){
if(operators[k] == '+'){
res.push_back(v[i] + v[j]);
}else if(operators[k] == '-'){
res.push_back(v[i] - v[j]);
}else if(operators[k] == '*'){
res.push_back(v[i] * v[j]);
}else{
res.push_back(v[i] / v[j]);
}
if(solve(res)) return true;
res.pop_back();
}
}
}
return false;
}
};
main(){
Solution ob;
vector<int> v = {4,9,2,6};
cout << (ob.judgePoint24(v));
} อินพุต
{4,9,2,6} ผลลัพธ์
1