[深搜]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;
} 

 

posted @ 2021-02-16 17:59  unknown_future  阅读(117)  评论(0编辑  收藏  举报