虫食算
2026-07-13 23:28:05
发布于:吉林
5阅读
0回复
0点赞
1.严格按本位加法等式推导未知字母,数学推导无漏洞;
2.数字从 n-1 倒序枚举,加速找到唯一解,解决 TLE;
3.输入加速 ios::sync_with_stdio(false); cin.tie(0); 降低常数
进位只存在 0/1,推导循环仅 k=0、1,无多余分支
代码如下:
#include <iostream>
#include <cstring>
#include <string>
using namespace std;
int n, p, a, b, c, va, vb, vc, total, want_a, want_b, want_c, out_carry, tar;
string s1, s2, s3;
int num[26];
bool used[26], ans_found;
void dfs(int pos, int in_carry){
if (ans_found){
return;
}
if (pos == n){
if (in_carry == 0) {
ans_found = true;
}
return;
}
p = n - 1 - pos;
a = s1[p] - 'A';
b = s2[p] - 'A';
c = s3[p] - 'A';
va = num[a];
vb = num[b];
vc = num[c];
if (va != -1 && vb != -1 && vc != -1){
total = va + vb + in_carry;
if (total % n == vc){
dfs(pos + 1, total / n);
}
return;
}
if (va != -1 && vb != -1){
total = va + vb + in_carry;
want_c = total % n;
out_carry = total / n;
if (vc == -1 && !used[want_c]){
num[c] = want_c;
used[want_c] = true;
dfs(pos + 1, out_carry);
if (ans_found){
return;
}
num[c] = -1;
used[want_c] = false;
}
return;
}
if (va != -1 && vc != -1){
for (int k = 0; k <= 1; k++){
want_b = vc + k * n - va - in_carry;
if (want_b >= 0 && want_b < n && vb == -1 && !used[want_b]){
num[b] = want_b;
used[want_b] = true;
dfs(pos + 1, k);
if (ans_found) return;
num[b] = -1;
used[want_b] = false;
}
}
return;
}
if (vb != -1 && vc != -1){
for (int k = 0; k <= 1; k++){
want_a = vc + k * n - vb - in_carry;
if (want_a >= 0 && want_a < n && va == -1 && !used[want_a]){
num[a] = want_a;
used[want_a] = true;
dfs(pos + 1, k);
if (ans_found) {
return;
}
num[a] = -1;
used[want_a] = false;
}
}
return;
}
if (va == -1) {
tar = a;
}
else{
if (vb == -1){
tar = b;
}
else{
tar = c;
}
}
for (int d = n - 1; d >= 0; d--) {
if (used[d]){
continue;
}
num[tar] = d;
used[d] = true;
dfs(pos, in_carry);
if (ans_found){
return;
}
num[tar] = -1;
used[d] = false;
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin >> n >> s1 >> s2 >> s3;
memset(num, -1, sizeof(num));
memset(used, 0, sizeof(used));
ans_found = false;
dfs(0, 0);
for (int i = 0; i < n; i++){
cout << num[i];
if (i != n - 1) {
cout << " ";
}
}
return 0;
}
这里空空如也



有帮助,赞一个