【b404】虫食算
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】虫食算的更多相关文章
- 洛谷 P1092 虫食算 Label:dfs
题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...
- 深度优先搜索 codevs 1064 虫食算
codevs 1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 所 ...
- codevs1064 虫食算
题目描述 Description 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 + 8468#6 ...
- NOIP2004 虫食算
描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子:43#9865#045+ 8468#6633= 44445506678其中#号代表 ...
- Codevs 1064 虫食算 2004年NOIP全国联赛提高组
1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 所谓虫食算,就是原先的算式 ...
- Luogu P1092 虫食算
题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...
- 【NOIP2004】【CJOJ1703】【洛谷1092】虫食算
题面 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 ...
- 【NOIP2004】虫食算
Description 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +. 8468#6633 444455 ...
- 洛谷P1092 虫食算
P1092 虫食算 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: http://paste.ubuntu.com/2544 ...
随机推荐
- uiautomator_python使用汇总
1.判断按钮状态 if d(resourceId="id",enabled=False): #判断当前按钮是否为未激活状态,为True则为激活状态2.获取toast提示语 d.to ...
- 利用mysql5.6 的st_distance 实现按照距离远近排序。 (转载)
http://blog.csdn.net/zhouzhiwengang/article/details/53612481
- android--显式跳转和隐式跳转的差别使用方法
#创建第二个activity * 新创建的activity.必须在清单文件里做配置,否则系统找不到,在显示时会直接报错 <activity android:name="com.ithe ...
- 多线程在python中的使用 thread
近期想学习研究一下python中使用多线程,来提高python在爬虫项目中的效率. 如今我们在网页上查询到在python中使用的多线程的使用大多数都是使用的threading模块,可是python中另 ...
- python3 打印九九乘法表
打印九九乘法表 # !/usr/bin/env python # -*- coding:utf-8 -*- # Author:Hiuhung Wan for i in range(1, 10): fo ...
- hdu 3416 Marriage Match IV (最短路+最大流)
hdu 3416 Marriage Match IV Description Do not sincere non-interference. Like that show, now starvae ...
- IOS计算两点之间的距离
//广州经纬度 CLLocationCoordinate2D guangZhouLocation; guangZhouLocation.latitude = 23.20; guangZhouLocat ...
- tomcat总体架构
Tomcat 总体结构图 从上图中可以看出Tomcat的心脏是两个组件:Connector 和 Container,关于这两个组件将在后面详细介绍.Connector 组件是可以被替换,这样可以提供给 ...
- 三、链路追踪系统 zipkin
一.构建项目 用到的依赖直接看pom.xml的注释吧 <?xml version="1.0" encoding="UTF-8"?> <proj ...
- JAVA中try-catch异常逃逸
有时候一些小的细节,确实比较纠结,对于try-catch-finally代码块中代码依次执行,当try中有exception抛出时,将会有catch拦截并执行,如果没有catch区块,那么except ...