Time Limit: 1 second

Memory Limit: 50 MB

【问题描述】

所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子: 43#9865#045 + 8468#6633 44445506978 其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5。 现在,我们对问题做两个限制: 首先,我们只考虑加法的虫食算。这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0。 其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同的数字用不同的字母表示。如果这个算式是N进制的,我们就取英文字母表午的前N个大写字母来表示这个算式中的0到N-1这N个不同的数字:但是这N个字母并不一定顺序地代表0到N-1)。输入数据保证N个字母分别至少出现一次。 BADC + CRDA DCCC 上面的算式是一个4进制的算式。很显然,我们只要让ABCD分别代表0123,便可以让这个式子成立了。你的任务是,对于给定的N进制加法算式,求出N个不同的字母分别代表的数字,使得该加法算式成立。输入数据保证有且仅有一组解.

【输入】

共4行;
第一行是一个整数N(N<=26)
接下来的3行,每行有一个由大写字母组成的字符串,分别代表两个加数以及和。这3个字符串左右两端都没有空格,从高位到低位,并且恰好有N位。

【输出】

包含1行,在这一行中,应当包含唯一的那组解。解是这样表示的:输出N个数字,分别表示A,B,C……所代表的数字,相邻的两个数字用一个空格隔开,不能有多余的空格。

【输入样例】

5
ABCED
BDACE
EBBAA

【输出样例1】

1 0 3 4 2

【 数据规模】

30%的数据满足:n<=10
50%的数据满足:n<=15
100%的数据满足:n<=26

【题目链接】:http://noi.qz5z.com/viewtask.asp?id=b404

【题意】

【题解】



每次搜索确定一个字母的值;

看看是不是满足

s[3][i]=(s[1][i]+s[2][i]+1)%n;



s[3][i]=(s[1][i]+s[2][i])%n;

如果都不满足就返回false;

(根据s[1][i],s[2][i]以及s[3][i]有没有被确定,

如果确定了两个值,那么就看看第3个值有没有被其他的字母占用,如果被占用了也能返回false);

然后根据我们的规则;

尽量按照出现的顺序来进行搜索;这样比较容易剪枝;(即较早地出现

s[1][i]、s[2][i]和s[3][i]);



【完整代码】

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define rei(x) scanf("%d",&x)
#define rep1(i,x,y) for (int i = x;i <= y;i++)
#define rep2(i,x,y) for (int i = x;i >= y;i--) const int N = 30; char ss[4][N];
int s[4][N];
int n, a[N], tot, sta[N];
int b[N]; bool can()
{
rep2(i, n, 1)
{
int x = b[s[1][i]], y = b[s[2][i]], z = b[s[3][i]];
if (x != -1 && y != -1 && z != -1)
{
if ((x + y) % n != z && (x + y + 1) % n != z)
return false;
else
continue;
}
if (x != -1 && y != -1 && z == -1)
{
if (a[(x + y) % n] != -1 && a[(x + y + 1) % n] != -1) return false;
else
continue;
}
if (x != -1 && y == -1 && z != -1)
{
int b1 = (z - x + n) % n, b2 = (z - 1 - x + n) % n;
if (a[b1] != -1 && a[b2] != -1) return false;
else
continue;
}
if (x == -1 && y != -1 && z != -1)
{
int a1 = (z - y + n) % n, a2 = (z - 1 - y + n) % n;
if (a[a1] != -1 && a[a2] != -1) return false;
else
continue;
}
}
return true;
} void dfs(int x)
{
if (x>tot)
{
int xx = 0;
rep2(i, n, 1)
{
int x = b[s[1][i]], y = b[s[2][i]], z = b[s[3][i]];
int temp = x + y + xx;
xx = temp / n;
temp %= n;
if (z != temp)
return; }
if (xx>0) return;
for (int i = 1; i <= n; i++)
{
printf("%d", b[i]);
if (i == n)
puts("");
else
putchar(' ');
}
exit(0);
}
rep2(i, n - 1, 0)
if (a[i] == -1)
{
a[i] = sta[x];
b[sta[x]] = i;
if (can())
dfs(x + 1);
b[sta[x]] = -1;
a[i] = -1;
}
} int main()
{
//freopen("D:\\rush.txt","r",stdin);
rei(n);
scanf("%s", ss[1] + 1);
scanf("%s", ss[2] + 1);
scanf("%s", ss[3] + 1);
//1 0 3 4 2
memset(a, 255, sizeof a);
rep2(i, n, 1)
{
rep1(j, 1, 3)
{
s[j][i] = ss[j][i] - 'A' + 1;
if (b[s[j][i]] == 0)
{
sta[++tot] = s[j][i];
b[s[j][i]] = -1;
}
}
}
dfs(1);
return 0;
}

【b404】虫食算的更多相关文章

  1. 洛谷 P1092 虫食算 Label:dfs

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

  2. 深度优先搜索 codevs 1064 虫食算

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

  3. codevs1064 虫食算

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

  4. NOIP2004 虫食算

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

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

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

  6. Luogu P1092 虫食算

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

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

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

  8. 【NOIP2004】虫食算

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

  9. 洛谷P1092 虫食算

    P1092 虫食算 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: http://paste.ubuntu.com/2544 ...

随机推荐

  1. 【例题 6-21 UVA - 506】System Dependencies

    [链接] 我是链接,点我呀:) [题意] 在这里输入题意 [题解] 记录每个物品它的依赖有哪些,以及它被哪些东西依赖就可以了. 显式安装的东西不能被隐式删除删掉(就是remove item,然后删除i ...

  2. js进阶 14-4 $.get()方法和$.post()方法如何使用

    js进阶 14-4 $.get()方法和$.post()方法如何使用 一.总结 一句话总结:$.get(URL,callback); $.post(URL,data,callback); callba ...

  3. CentOS 6 通过DVD快速建立本地YUM源

    一.将DVD光盘放入RedHat/CentOS6.X服务器/电脑光驱中 二.挂载DVD光驱到/mnt/cdrom # mkdir -p /mnt/cdrom # mount -t iso9660 /d ...

  4. Qt5 UI信号、槽自动连接的控件重名大坑(UI生成的槽函数存在一个隐患,即控件重名。对很复杂的控件,不要在 designer 里做提升,而是等到程序启动后,再动态创建,可以避免很多问题)

    对Qt5稍有熟悉的童鞋都知道信号.槽的自动连接机制.该机制使得qt designer 设计的UI中包含的控件,可以不通过显式connect,直接和cpp中的相应槽相关联.该机制的详细文章见 http: ...

  5. (转)ipv4的网段表示方法

    简单一点举例说明:ip段:10.0.0.1-10.0.0.255            的表示方法:10.0.0.0/24ip段:10.0.0.1-10.0.255.255        的表示方法: ...

  6. windows7 通过WSUS服务器更新,报错,错误代码800b0001

    链接 您好,根据分析您的日志,可以看到“WARNING: WU client failed Searching for update with error 0x800b0001”等关键信息, 故障原因 ...

  7. <p><span style="font-size:14px">近期须要批量将PNM&#26684;式的文件转换成GIF文件。我尝试了例如以下的图像转换工具:</span></p>

    近期须要批量将PNM格式的文件转换成GIF文件.我尝试了例如以下的图像转换工具: ImageBatch:全然免费,但只支持PNG JPEG BMP GIF四种格式 OfficeConverter:在线 ...

  8. Linux system函数返回值

    例: status = system("./test.sh"); 1.先统一两个说法: (1)system返回值:指调用system函数后的返回值,比如上例中status为syst ...

  9. CSS Sprite的相关概念

    原文 简书原文:https://www.jianshu.com/p/8ae3be23a642 大纲 1.什么是CSS Sprite 2.CSS Sprite的优点 3.CSS Sprite的缺点 4. ...

  10. 【u118】日志分析

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] M 海运公司最近要对旗下仓库的货物进出情况进行统计.目前他们所拥有的唯一记录就是一个记录集装箱进出情况 ...