题目传送

(据说官方正解为高斯消元,但用搜索也能过,这里就讲讲搜索算法吧。)

  对于一道搜索题,首先考虑一下大体怎样搜索。因为要考虑加法的进位,所以从左往右搜索对于考虑进位来说十分麻烦,而从右往左搜索就没有这种麻烦,故搜索顺序从右往左。但是发现整个式子的一位上由三个字符串的一位组成,且这三个分别担当加数、结果中的一部分,逐个搜索的话还要麻烦地分类讨论,考虑再优化一下搜索顺序。发现一共只有n个不同的数和字母,并且每个数和字母都至少出现一次,那么可以从右往左找出字母第一次出现的位置并存到next数组里,只要按照next数组搜一遍就完事了。

  显然一个裸搜在此题肯定会TLE了,考虑一下剪枝。由于每个字符串都有n位,那么作为加数的两个字符串的最高位加进位加起来一定不能大于等于n导致进位。同时如果发现在同一位的数若都已经确定,发现两加数那一位上的数的和mod n(不进位的情况)不等于结果那一位上的数,并且两加数那一位上的数的和+1再mod n(进位的情况)仍然不等于结果那一位上的数,显然是不合题意的,故要剪掉。

  一个小技巧:发现相同的字母代表相同的数。我们可以把字母数字化,即每个字母都减'A'加1,这样若原字母为'A',处理后就为1,若为'B',就为2,...以此类推。这样可以让处理后的值作为最后记录答案的数组num的下标,同一个字母处理后的变为的下标也一样,故可以统一处理。

见AC代码:

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib> using namespace std; int n; char s1[],s2[],s3[]; int a[],b[],c[],next[],cnt,num[]; bool used[]; inline void getused(int x)//处理出next数组
{
if(!used[x])
{
used[x]=;
next[++cnt]=x;
}
} inline int canprune()//剪枝判断 prune:剪枝(来自翻译)
{
if(num[a[]]+num[b[]]>=n)
return ;
int A,B,C;
for(int i=n;i>=;i--)
{
A=num[a[i]],B=num[b[i]],C=num[c[i]];
if(A==-||B==-||C==-) continue;
if((A+B)%n!=C&&(A+B+)%n!=C) return ;
}
return ;
} inline int judge()//结果判断
{
if(num[a[]]+num[b[]]>=n)
return ;
int A,B,C,x=;
for(int i=n;i>=;i--)
{
A=num[a[i]],B=num[b[i]],C=num[c[i]];
if((A+B+x)%n!=C) return ;
x=(A+B+x)/n;
}
return ;
} void print()
{
for(int i=;i<n;i++)
printf("%d ",num[i]);
cout<<num[n];
exit();//要用 stdlib.h 或 cstdlib库(少了头文件的话本地虽然能过,但交上去就回CE),作用是直接退出程序。
} void dfs(int k)
{
for(int i=n-;i>=;--i)
if(!used[i])
{
num[next[k]]=i;
used[i]=;
if(k==n)
{
if(judge())
print();
}
else
{
if(!canprune())
dfs(k+);
}
num[next[k]]=-;
used[i]=;
}
} int main()
{
scanf("%d",&n);
scanf("%s%s%s",s1,s2,s3);
for(int i=n;i>=;--i)
{
a[i]=s1[i-]-'A'+;
getused(a[i]);
b[i]=s2[i-]-'A'+;
getused(b[i]);
c[i]=s3[i-]-'A'+;
getused(c[i]);
}
memset(num,-,sizeof num);
memset(used,,sizeof used);
dfs();
return ;
}

P1092 虫食算——题解的更多相关文章

  1. P1092 虫食算 题解(搜索)

    题目链接 P1092 虫食算 解题思路 好题啊!这个搜索好难写...... 大概是要考虑进位和考虑使用过某个数字这两个东西,但就很容易出错...... 首先这个从后往前搜比较好想,按照从后往前出现的顺 ...

  2. 【题解】 P1092虫食算

    [题解]P1092 虫食算 老题了,很经典. 用到了一些搜索套路. 可行性剪枝,劣者靠后,随机化,\(etc......\) 搜索设参也很有技巧,设一个\(adjustment\)参数可以很方便地在两 ...

  3. 洛谷P1092 虫食算

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

  4. Luogu P1092 虫食算(枚举+剪枝)

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

  5. 洛谷 P1092 虫食算 Label:dfs

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

  6. Luogu P1092 虫食算

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

  7. [NOIP2004] 提高组 洛谷P1092 虫食算

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

  8. 洛谷—— P1092 虫食算

    https://www.luogu.org/problem/show?pid=1092 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简 ...

  9. NOIP 2004 虫食算题解

    问题 E: [Noip2004]虫食算 时间限制: 1 Sec  内存限制: 128 MB 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一 ...

随机推荐

  1. HTTPS测试

    1.首先理解HTTPS的含义,清楚http与HTTPS的区别 2.相对于http而言,https更加安全,因 3.使用数字证书使传输更安全,数字证书使用keytool工具生成 测试准备: 创建公钥和秘 ...

  2. 十、Zabbix-自动关联模板

    之前的文章中,我们实现了自动注册,自动分组:并且创建了模板,监控项,触发器.为的就是能够实现主机自动被期望的监控项监控到.接下来我们只要能让自动注册的主机能够自动连接到我们设置好的模板,就可以实现自动 ...

  3. 安装开发环境vs2017+sql2016+tfs2017

    安装开发环境vs2017+sql2016+tfs2017 编写人:左丘文 2019-7-16 近一年了,一直没空着手写点什么,跟大家交待下吧,去年一次机会,其实也不完全是去年,因此离开了我工作15年的 ...

  4. vue 还原Data里面的数据

    this.$data包含现有的data数据, this.$options.data()中是原有的data数据 还原代码 Object.assign(this.$data.searchForm, thi ...

  5. 偶遇com组件 .rc 文件 not found .tlb文件问题:

    好久木有弄com组件来,记忆已经模糊了,今天遇见一个编译问题,折腾了半天,mark一下: xxx_x64.rc(273): error RC2135: file not found: xxx.tlb ...

  6. 【ES6】迭代器与可迭代对象

    ES6 新的数组方法.集合.for-of 循环.展开运算符(...)甚至异步编程都依赖于迭代器(Iterator )实现.本文会详解 ES6 的迭代器与生成器,并进一步挖掘可迭代对象的内部原理与使用方 ...

  7. Dungeon Master (三维bfs)

    You are trapped in a 3D dungeon and need to find the quickest way out! The dungeon is composed of un ...

  8. 错误: JMX 连接器服务器通信错误: service:jmx:rmi://***

    电脑没有空间了,正想清理一下硬盘空间,这时不知道金山毒霸啥时候装上了,就想把它卸载了,卸载的过程中看到有空间清理,随手一点,清理出了10个G,然后再打开idea运行项目就报出这个错. 错误: JMX ...

  9. 【问题解决方案】CentOS7替换yum的问题:使用yum makecache出现File contains no section headers

    参考链接 CentOS7替换yum的问题:使用yum时出现File contains no section headers centos安装网络repo源及错误说明 一.centos替换yum的步骤 ...

  10. 转载 PowerDesigner导出mysql数据结构

    转自:https://blog.csdn.net/dkingyaoyao/article/details/84586146 好久没有使用PowerDesigner,突然想用它导出数据结构,居然忘记了. ...