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;
}

[深搜]C. 【例题3】虫食算的更多相关文章

  1. Luogu P1092 虫食算

    题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...

  2. P1092 虫食算(洛谷)

    今天做了一道题,我之前吹牛的时候曾经说:“这个题我觉得深搜剪枝一下就可以了.”. 我觉得我之前说的没错“这个题深搜剪枝亿下,再加点玄学就可以了!” 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子 ...

  3. 洛谷 P1092 虫食算 Label:dfs

    题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...

  4. codevs1064 虫食算

    题目描述 Description 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045    +    8468#6 ...

  5. NOIP2004 虫食算

    描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子:43#9865#045+ 8468#6633= 44445506678其中#号代表 ...

  6. Codevs 1064 虫食算 2004年NOIP全国联赛提高组

    1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 所谓虫食算,就是原先的算式 ...

  7. 【NOIP2004】【CJOJ1703】【洛谷1092】虫食算

    题面 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 ...

  8. 虫食算 2004年NOIP全国联赛提高组(dfs)

    1064 虫食算 2004年NOIP全国联赛提高组  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Descrip ...

  9. NOIP 2004 虫食算题解

    问题 E: [Noip2004]虫食算 时间限制: 1 Sec  内存限制: 128 MB 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一 ...

随机推荐

  1. 为什么NGK推出的DEFI项目这么火热?

    进入到2020年的下半年,DeFi的锁仓量基本上是以日破新高的态势,不断的成为一个独角兽.DeFi逐渐形成一个独角兽的同时,也在不断的给区块链生态赋能,源源不断进行金融价值输送.所以加密货币体量的不断 ...

  2. javascript初体验(一)

    数据类型 数字 (Number),整数或浮点数,例如42或3.14159 字符串 (String) 布尔值 (Boolean) null (js大小写敏感,因此null和NULL不一样) undefi ...

  3. vue路由理解

    vue路由:就是一个菜单的概念比如说有一个菜单栏,菜单栏上有很多按钮,当你点击一个按钮时会出现不同的页面,这就是vue路由

  4. 使用Docker创建MongoDb服务

    使用Docker创建MongoDb服务 1.先拉mongodb镜像 docker pull mongodb:4.2.5 2.创建映射目录 创建mongo映射目录,用于存放后面的相关东西. mkdir ...

  5. EF获取数据库表名和列名

    EF获取数据库表名和列名 新建 模板 小书匠 /// <summary>  /// 通过当前DBContext上下文获取对应数据库中所有得表  /// </summary>  ...

  6. 后端程序员之路 1、linux、centos

    CentOS.Ubuntu.Debian三个linux比较异同 - 记事本 - 博客频道 - CSDN.NEThttp://blog.csdn.net/educast/article/details/ ...

  7. MySQL之四 存储引擎

    1.介绍 存储引擎MySQL中的"文件系统" MySQL体系结构 InnoDB存储引擎介绍 My1SAM 和InnoDB区别  mysql MariaDB [(none)]> ...

  8. h5返回上一页ios页面不刷新

    var isPage=false; window.addEventListener('pageshow', function () {         if (isPage) { window.loc ...

  9. JavaScript实现动态添加员工

    html代码: <div id="empAdd"> <fieldset> <legend><strong>添加员工</stro ...

  10. 【转载】快速理解android View的测量onMeasure()与MeasureSpec

    笔者之前有一篇文章已经使用onMeasure()解决了listview与scollview的显示冲突问题,博客地址如下: onMeasure简单方法 完美解决ListView与ScollView冲突问 ...