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. SVG namespace & preview bug

    SVG namespace & preview bug error This XML file does not appear to have any style information as ...

  2. WebView & WKWebView & UIWebView

    WebView & WKWebView & UIWebView WebView WKWebView https://developer.apple.com/documentation/ ...

  3. 「NGK每日快讯」11.19日NGK第16期官方快讯!

  4. 【.NET 与树莓派】控制舵机

    不管是小马达,还是大马达,嗯,也就是电机,相信大伙伴们也不会陌生.四驱车是一种很优秀的玩具,从老周小时候就开始流行(动画片<四驱兄弟>估计很多大朋友都看过),直到现在还能看到很多卖四驱车的 ...

  5. JDK源码阅读-FileDescriptor

    本文转载自JDK源码阅读-FileDescriptor 导语 操作系统使用文件描述符来指代一个打开的文件,对文件的读写操作,都需要文件描述符作为参数.Java虽然在设计上使用了抽象程度更高的流来作为文 ...

  6. 一文读懂Servlet

    1 Servlet简介 Servlet就是sun公司开发动态web的一门技术 Sun在这些API中提供一个接口叫做:Servlet. 开发一个Servlet程序,只需两步: 编写一个类,实现Servl ...

  7. 1022 Digital Library——PAT甲级真题

    1022 Digital Library A Digital Library contains millions of books, stored according to their titles, ...

  8. mysql 单表下的字段操作

    如下只介绍单表的添加.更新.删除.查询表结构操作,查询数据操作范围太大用单独的篇幅来讲解: 查看表结构 desc test_tb; Insert 插入数据 插入 = 添加 为表中指定的字段插入数据 C ...

  9. 面试题-python 如何读取一个大于 10G 的txt文件?

    前言 用python 读取一个大于10G 的文件,自己电脑只有8G内存,一运行就报内存溢出:MemoryError python 如何用open函数读取大文件呢? 读取大文件 首先可以自己先制作一个大 ...

  10. URL 地址解析

    //虚拟目录的路径 Response.Write("<strong>Request.ApplicationPath:</strong>" + Request ...