洛谷P1092 虫食算(回溯法)
来源:互联网 发布:视频管理系统php 编辑:程序博客网 时间:2024/06/05 10:49
洛谷P1092 虫食算(回溯法)
题目描述
所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子:http://paste.ubuntu.com/25448822/
其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是5和3,第二行的数字是5。
现在,我们对问题做两个限制:
首先,我们只考虑加法的虫食算。这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0。
其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同的数字用不同的字母表示。如果这个算式是N进制的,我们就取英文字母表午的前N个大写字母来表示这个算式中的0到N-1这N个不同的数字:但是这N个字母并不一定顺序地代表0到N-1)。输入数据保证N个字母分别至少出现一次。
http://paste.ubuntu.com/25448824/
上面的算式是一个4进制的算式。很显然,我们只要让ABCD分别代表0123,便可以让这个式子成立了。你的任务是,对于给定的N进制加法算式,求出N个不同的字母分别代表的数字,使得该加法算式成立。输入数据保证有且仅有一组解
输入输出格式
输入格式:
包含四行。第一行有一个正整数N(N<=26),后面的3行每行有一个由大写字母组成的字符串,分别代表两个加数以及和。这3个字符串左右两端都没有空格,从高位到低位,并且恰好有N位。输出格式:
包含一行。在这一行中,应当包含唯一的那组解。解是这样表示的:输出N个数字,分别表示A,B,C……所代表的数字,相邻的两个数字用一个空格隔开,不能有多余的空格。输入输出样例
输入样例:
5ABCED
BDACE
EBBAA
输出样例:
1 0 3 4 2说明
对于30%的数据,保证有N<=10;对于50%的数据,保证有N<=15;
对于全部的数据,保证有N<=26。
noip2004提高组第4题
解题分析
基本思路是用回溯法对每一个字母进行枚举(0到n-1),但如不进行剪枝和优化,则肯定有测试用例超时(复杂度O(n!))。题目分析:共有n个不同的字母,每个字母表示不同的数字(0到n-1);a, b, c的长度相同,因此最高位没有进位。
可以进行如下剪枝和优化:
1、与手工计算加法的方法一样,从个位数开始搜索。为了方便起见,开始先将三个字符串逆序。
2、对每一个字母枚举的顺序为从n-1到0,因为最高位没有进位,这样搜索可以更快地得到结果。
3、在枚举字母时,按照从低位到高位第一次出现的字母的次序进行。这样在回溯时可以更有效率地判断是否进入下一个分支。
4、在判断可以进入下一分支前(假设已经判断到a, b, c的第i个字符),如果在i到最高位之间的某个位置j,a[j],b[j], c[j]都已确定,则判断它们是否合法,如果不合法,则不能进入下一个分支。由于不知道进位,但进位只能是0或1,因此在判断是否合法时,在(a[j]+b[j])%n和(a[j]+b[j]+1)%n这两个数中,如果都不等于c[j],则肯定是不合法的。
5、在对一个字母进行枚举时,如果其第一次出现的在i列,但在i列的其他两个元素都已经知道,则可有由他两个元素的值和进位计算该字母应该是哪个数字,而不需要从0~n逐个枚举。在判断是否可行时,只要判断从i开始向后的各列即可(因为能到i列,说明前面i-1列都合法),由于前i-1列都合法,在判断前i-1列时可以得到每一步的进位数carry[]。要实现该优化,还必须记录每一个字母第一次出现的列数。
6、在判断是否进入下一分支前,如果判断到某列i中有2个字母已确定,则计算第三个字母(进位为carry[i-1])的值,如果该值已经被其他字母占用,则不能进入下一分支。
7、尽量避免采用除法,因为除法的计算时间比其他运算符都要大。
8、由于a, b, c的都是n位,因此,如果最高位进位,则不能进入下一分支。
9、如果得到结果,则尽快退出回溯,可采用flag判断是否已得到结果。
10、尽量不要用STL中的容器,本来打算采用map存储字母和值之间的映射关系,但测试用例9始终TLE,改掉之后一下变为24ms,其他都为0ms。看来容器所增加的复杂度系数不容小觑。
#include#include #include #include #include
阅读全文
0 0
- 洛谷P1092 虫食算(回溯法)
- 洛谷 P1092 虫食算
- 洛谷 P1092 虫食算
- 洛谷 P1092 虫食算
- 【搜索】洛谷 P1092 虫食算
- 洛谷 P1092 [NOIP2004 T4] 虫食算
- |洛谷|NOIP2004|搜索|P1092 虫食算
- P1092 虫食算
- P1092 虫食算
- P1092 虫食算
- 洛谷P1092
- Luogu P1092 虫食算
- 洛谷p1092合唱队形
- 回溯法(1)
- 回溯法(2)
- (八)回溯法
- 回溯法(1)
- 回溯法(1)
- 手动升级ubuntu openssh-server
- 【51nod】1101 换零钱
- Mac下查看node等的安装路径
- 小白成长之路(1)--应用CSS之前的必须看懂的代码
- 台湾大学机器学习基石Lecture4
- 洛谷P1092 虫食算(回溯法)
- 学习笔记 Linux 启动logo修改
- 替换空格 (剑指Offer 第 2 题)
- 移动端效果之swiper
- WEB服务器、应用程序服务器、HTTP服务器有何区别
- 加载网络图片
- Window10企业版激活
- qbxt国庆水题记day5
- libxxx.so- text relocations问题的终极解决方案