สมมติว่าเรามีสมการ นิพจน์แสดงด้วยคำทางด้านซ้ายและผลลัพธ์ทางด้านขวา เราต้องตรวจสอบว่าสมการแก้ได้ตามกฎต่อไปนี้หรือไม่ -
-
อักขระแต่ละตัวจะถูกถอดรหัสเป็นตัวเลขเดียว (0 ถึง 9)
-
อักขระที่ต่างกันทุกคู่ต้องจับคู่กับตัวเลขที่ต่างกัน
-
แต่ละคำ[i]และผลลัพธ์จะถูกถอดรหัสเป็นตัวเลขที่ไม่มีศูนย์นำหน้า
-
ผลรวมของตัวเลขทางด้านซ้ายจะเท่ากับตัวเลขทางด้านขวา
-
เราจะตรวจสอบว่าสมการแก้ได้หรือไม่
ดังนั้น ถ้า input เหมือนกับ word =["SEND","MORE"], result ="MONEY" ผลลัพธ์ที่ได้จะเป็น True เช่นเมื่อเราจับคู่ตัวอักษรดังนี้:Map 'S'-> 9, 'E '->5, 'N'->6, 'D'->7, 'M'->1, 'O'->0,'R'->8, 'Y'->'2' จากนั้น "SEND" + "MORE" ="MONEY" เหมือนกับ 9567 + 1085 =10652
เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -
-
กำหนดอาร์เรย์ i2c ที่มีขนาด:10, อาร์เรย์ c2i ที่มีขนาด:26 และอาร์เรย์อื่นที่มี
-
กำหนดฟังก์ชัน Solve() ซึ่งจะใช้ idx, l, sum,
-
ถ้า l เท่ากับขนาดของ r แล้ว −
-
คืนค่า จริง เมื่อผลรวมเท่ากับ 0
-
-
ถ้า idx เท่ากับขนาดของ w แล้ว −
-
ถ้า c2i[r[l] - ASCII ของ 'A'] ไม่เท่ากับ -1 แล้ว −
-
ถ้า c2i[r[l] - ASCII ของ 'A'] เหมือนกับผลรวม mod 10 แล้ว -
-
ผลตอบแทนแก้(0, l + 1, ผลรวม / 10)
-
-
-
มิฉะนั้นเมื่อ i2c[sum mod 10] เหมือนกับ -1 ดังนั้น −
-
ถ้า l เท่ากับขนาดของ r และ sum mod 10 เท่ากับ 0 ดังนั้น −
-
คืนค่าเท็จ
-
-
c2i[r[l] - ASCII ของ 'A'] =ผลรวม mod 10
-
i2c[sum mod 10] =r[l] - ASCII ของ 'A'
-
อุณหภูมิ :=แก้(0, l + 1, ผลรวม / 10)
-
c2i[r[l] - ASCII ของ 'A'] =- 1
-
i2c[sum mod 10] =- 1
-
อุณหภูมิกลับ
-
-
คืนค่าเท็จ
-
-
ถ้า l>=ขนาดของ w[idx] แล้ว −
-
คืนค่าแก้(idx + 1, l, ผลรวม)
-
-
ถ้า c2i[w[idx, l] - 'A'] ไม่เท่ากับ -1 แล้ว −
-
ถ้า l เท่ากับขนาดของ w[idx] และ c2i[w[idx, l] - ASCII ของ 'A'] เท่ากับ 0 ดังนั้น −
-
คืนค่าเท็จ
-
-
ผลตอบแทนการแก้ (idx + 1, l, ผลรวม + c2i[w[idx, l] - ASCII ของ 'A'])
-
-
สำหรับการเริ่มต้น i :=0 เมื่อ i <10 อัปเดต (เพิ่ม i ขึ้น 1) ให้ทำ -
-
ถ้า i2c[i] ไม่เท่ากับ -1 แล้ว −
-
ละเว้นส่วนต่อไปนี้ ข้ามไปยังการทำซ้ำถัดไป
-
-
ถ้าฉันเท่ากับ 0 และ l เท่ากับขนาดของ w[idx] แล้ว −
-
ละเว้นส่วนต่อไปนี้ ข้ามไปยังการทำซ้ำถัดไป
-
-
i2c[i] :=w[idx, l] - ASCII ของ 'A'
-
c2i[w[idx, l] - ASCII ของ 'A'] =i
-
temp :=แก้(idx + 1, l, sum + i)
-
i2c[i] :=-1
-
c2i[w[idx, l] - ASCII ของ 'A'] =- 1
-
ถ้าอุณหภูมิไม่เป็นศูนย์ −
-
คืนความจริง
-
-
-
คืนค่าเท็จ
-
จากวิธีหลัก ให้ทำดังต่อไปนี้ −
-
เติม i2c และ c2i ด้วย -1
-
กลับผลลัพธ์อาร์เรย์
-
สำหรับการเริ่มต้น i :=0, เมื่อ i <ขนาดของคำ, อัปเดต (เพิ่ม i ขึ้น 1), do−
-
ถ้าขนาดของคำ[i]> ขนาดของผลลัพธ์ −
-
คืนค่าเท็จ
-
-
กลับคำอาร์เรย์[i]
-
-
r :=ผลลัพธ์ w :=คำ
-
คืนค่าแก้(0, 0, 0)
ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -
ตัวอย่าง
#include <bits/stdc++.h> using namespace std; class Solution { public: char i2c[10]; int c2i[26]; vector<string> w; string r; bool solve(int idx, int l, int sum){ if (l == r.size()) { return sum == 0; } if (idx == w.size()) { if (c2i[r[l] - 'A'] != -1) { if (c2i[r[l] - 'A'] == sum % 10) { return solve(0, l + 1, sum / 10); } } else if (i2c[sum % 10] == -1) { if (l == r.size() - 1 && sum % 10 == 0) return false; c2i[r[l] - 'A'] = sum % 10; i2c[sum % 10] = r[l] - 'A'; bool temp = solve(0, l + 1, sum / 10); c2i[r[l] - 'A'] = -1; i2c[sum % 10] = -1; return temp; } return false; } if (l >= w[idx].size()) { return solve(idx + 1, l, sum); } if (c2i[w[idx][l] - 'A'] != -1) { if (l == w[idx].size() - 1 && c2i[w[idx][l] - 'A'] == 0){ return false; } return solve(idx + 1, l, sum + c2i[w[idx][l] - 'A']); } for (int i = 0; i < 10; i++) { if (i2c[i] != -1) continue; if (i == 0 && l == w[idx].size() - 1) continue; i2c[i] = w[idx][l] - 'A'; c2i[w[idx][l] - 'A'] = i; bool temp = solve(idx + 1, l, sum + i); i2c[i] = -1; c2i[w[idx][l] - 'A'] = -1; if (temp) return true; } return false; } bool isSolvable(vector<string>& words, string result){ memset(i2c, -1, sizeof(i2c)); memset(c2i, -1, sizeof(c2i)); reverse(result.begin(), result.end()); for (int i = 0; i < words.size(); i++) { if (words[i].size() > result.size()) return false; reverse(words[i].begin(), words[i].end()); } r = result; w = words; return solve(0, 0, 0); } }; main(){ Solution ob; vector<string> v = {"SEND","MORE"}; cout << (ob.isSolvable(v, "MONEY")); }
อินพุต
{"SEND","MORE"}, "MONEY"
ผลลัพธ์
1