[深搜]C. 【例题3】虫食算
C . 【 例 题 3 】 虫 食 算
题目解析
正解 : Dfs + 剪枝
依题意,把样例以加法的形式展现出来.
根据加法的性质,可以得出有两种情况:有进位和没有进位的.
而从百位到最高位的结果,又可能是有从上一位进过一的.
因为三个字符串的长度都为
n
n
n,所以最高位是没有进一的根据以上的结论,容易得出
A
+
B
=
E
∣
∣
A
+
B
+
1
=
E
A+B=E ~~~||~~~A+B+1=E
A+B=E ∣∣ A+B+1=E
代码思路:带有剪枝的深搜
Code
#include <bits/stdc++.h> #define N 55 using namespace std; int n, ct; int a[N], b[N]; char s[4][N]; void dfs (int x, int y, int t) { if (ct == 1) return ; if (y == -1) { if (t == 0) { for (int i = 0; i < n; ++ i) printf ("%d ", a[i]); ct = 1; } return ; } for (int i = y; i >= 0; -- i) { int a1 = a[s[1][i] - 'A'], a2=a[s[2][i] - 'A'], a3 = a[s[3][i] - 'A']; if (a1 == -1 || a2 == -1 || a3 == -1) continue; if ((a1 + a2) % n != a3 && (a1 + a2 + 1) % n != a3) return ; } if (a[s[x][y] - 'A'] < 0) { for (int i = n - 1; i >= 0; -- i) { if (b[i] == 0) { if (x != 3) { a[s[x][y] - 'A'] = i; b[i] = 1; dfs (x + 1, y, t); a[s[x][y] - 'A'] = -1; b[i] = 0; } else { int sum = a[s[1][y] - 'A'] + a[s[2][y] - 'A'] + t; if (sum % n != i) continue; b[i] = 1; a[s[x][y] - 'A'] = i; dfs (1, y - 1, sum / n); b[i] = 0; a[s[x][y] - 'A'] = -1; } } } return ; } if (x != 3) { dfs (x + 1, y, t); } else { int sum = a[s[1][y] - 'A'] + a[s[2][y] - 'A'] + t; if (sum % n != a[s[3][y] - 'A']) return ; dfs(1, y - 1, sum / n); } } int main () { scanf ("%d", &n); for (int i = 1; i <= 3; ++ i) scanf ("%s", s[i]); memset (a, -1, sizeof (a)); dfs (1, n - 1, 0); return 0; }