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. 洛谷 P1205 [USACO1.2]方块转换 Transformations

    P1205 [USACO1.2]方块转换 Transformations 题目描述 一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案.写一个程序来找出将原始 ...

  2. What is corresponding Cron expression to fire in every X seconds, where X > 60? --转载

    原文地址:http://stackoverflow.com/questions/2996280/what-is-corresponding-cron-expression-to-fire-in-eve ...

  3. Altium Designer中的粉红色网格和绿色框框

  4. JS实现跑马灯效果(鼠标滑入可暂停,离开继续跑)

    <!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8&quo ...

  5. UML学习总结(3)——StarUML指导手册

    StarUML使用说明-指导手册 原著:Stephen Wong            翻译:火猴 StarUML是一种生成类图和其他类型的统一建模语言(UML)图表的工具.这是一个用Java语言描述 ...

  6. 就目前市面上的面试整理来说,最全的BAT大厂面试题整理在这

    原标题:就目前市面上的面试整理来说,最全的BAT大厂面试题整理在这 又到了面试求职高峰期,最近有很多网友都在求大厂面试题.正好我之前电脑里面有这方面的整理,于是就发上来分享给大家. 这些题目是网友去百 ...

  7. (嵌入式开发)自己写bootloader之编写第一阶段

    最简单的bootloader的编写步骤: 1. 初始化硬件:关看门狗.设置时钟.设置SDRAM.初始化NAND FLASH 2. 如果bootloader比较大,要把它重定位到SDRAM 3. 把内核 ...

  8. 【BZOJ 2754】[SCOI2012]喵星球上的点名

    [链接]h在这里写链接 [题意]     n个人;     由姓和名组成.s1[i]和s2[i];     有m个询问串.     问你第j个询问串,是否为某个人的姓或者名的子串.     如果是的话 ...

  9. 【u252】泽泽在巴西

    Time Limit: 1 second Memory Limit: 128 MB [问题描述] 泽泽帮助了英国某街道尽量减少酸雨的伤害,街道办主任非常感激他,就把他领到一扇门前,告诉他这扇门能通往好 ...

  10. ORACLE中的Net Configuration Assistant 点击后无反应, sqlplus登录数据库提示Oracle11g ORA-12560: TNS: 协议适配器错误

    首先是对于点击无反应问题: 如果是客户端下的Net Configuration Assistant可用,而服务器端的Net Configuration Assistant等工具不可用的原因如下. 环境 ...