问题 E: [Noip2004]虫食算

时间限制: 1 Sec  内存限制: 128 MB

题目描述

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

输入

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

输出

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

样例输入

5
ABCED
BDACE
EBBAA

样例输出

1 0 3 4 2

提示

对于全部的数据,保证有N <= 26。

  这道题据说有两种解法,一种是搜索,一种是高斯消元,由于本蒟蒻不会高消解法,所以在这里只说搜索了。

  第一次打就是按照竖式从右往左进行搜索去枚举该点所代表的数,每枚举完前两行就去算出和看是否非法,然而T了1个点,1.5秒额……

  然后就去乖乖打正解了,挨个枚举每一个竖式上的位置毕竟还是太多,我们不如去枚举每一个字母所代表的数字,这样我们dfs n层就好了,我们每dfs一次就去check一下每一列是否变得合法,以保证每一个解的正确性,最后直接输出即可。

  下面就说一下check和具体剪枝:

  首先我们如果说某一列三位以及进位都知道的话我们可以直接检查,不合法直接return,如果不知道进位就枚举进几,反正只有1和0两种结果,然后传到下一位,如果说这三位数中有一些数我们并不知道,我们直接表示为不知道进几位,向下接着搜,且如果搜到最后一位而进位是1我们也需要表示为不合法。

  其次,我们应当按照字母从右上到坐下进行枚举,这样我们就可以保证在check时在位数低的时候基本都有数且更容易找出不合法的解。

  而对于每一位数字具体填谁我们可以从大向小枚举,因为本题最高位并无进位,所以最高位是一个较大的数的可能性较小,可以找到许多不合法的状态。

 #include<iostream>
#include<cstdlib>
#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cmath>
#include<map>
#define N 50
using namespace std;
int n,a[N][];
char b[N];
int c[N];
bool fw[N],fw2[N];
int sx[N],zz;
bool check()
{
int jw=-;
for(int l=;l<=n;l++)
{
if(c[a[l][]]==-||c[a[l][]]==-||c[a[l][]]==-)
{
jw=-;
continue;
}
else
{
if(jw!=-)
{
if((c[a[l][]]+c[a[l][]]+jw)%n==c[a[l][]])
{
jw=(c[a[l][]]+c[a[l][]]+jw)/n;
continue;
}
else return ;
}
else
{
if((c[a[l][]]+c[a[l][]]+)%n==c[a[l][]])
{
jw=(c[a[l][]]+c[a[l][]]+)/n;
continue;
}
else if((c[a[l][]]+c[a[l][]])%n==c[a[l][]])
{
jw=(c[a[l][]]+c[a[l][]])/n;
continue;
}
else return ;
}
}
}
return (jw!=);
}
inline void dfs(int x)
{
if(x==n+)
{
for(int i=;i<=n;i++)
printf("%d ",c[i]);
exit();
}
else
{
for(int i=n-;i>=;i--)
{
if(!fw[i])
{
fw[i]=;
c[sx[x]]=i;
if(check())
dfs(x+);
fw[i]=;
c[sx[x]]=-;
}
}
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=;i++)
{
scanf("%s",b+);
for(int j=n;j>=;j--)
{
c[j]=-;
a[n-j+][i]=b[j]-'A'+;
}
}
for(int i=;i<=n;i++)
{
for(int j=;j<=;j++)
{
if(!fw2[a[i][j]])
{
fw2[a[i][j]]=;
zz++;
sx[zz]=a[i][j];
}
}
}
dfs();
return ;
}

NOIP 2004 虫食算题解的更多相关文章

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

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

  2. P1092 虫食算——题解

    题目传送 (据说官方正解为高斯消元,但用搜索也能过,这里就讲讲搜索算法吧.) 对于一道搜索题,首先考虑一下大体怎样搜索.因为要考虑加法的进位,所以从左往右搜索对于考虑进位来说十分麻烦,而从右往左搜索就 ...

  3. 虫食算 2004年NOIP全国联赛提高组(dfs)

    1064 虫食算 2004年NOIP全国联赛提高组  时间限制: 2 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 Descrip ...

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

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

  5. 【题解】 P1092虫食算

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

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

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

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

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

  8. 【b404】虫食算

    Time Limit: 1 second Memory Limit: 50 MB [问题描述] 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单 ...

  9. [BZOJ1902]:[NOIP2004]虫食算(搜索)

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

随机推荐

  1. 自动启动 Windows 10 UWP 应用

    原文: https://docs.microsoft.com/zh-cn/windows/uwp/xbox-apps/automate-launching-uwp-apps 简介 开发人员有多种选项可 ...

  2. 图像滤镜艺术---保留细节的磨皮滤镜之PS实现

    原文:图像滤镜艺术---保留细节的磨皮滤镜之PS实现 目前,对于人物照片磨皮滤镜,相信大家没用过也听过吧,这个滤镜的实现方法是多种多样,有难有简,有好有差,本人经过长时间的总结,得出了一种最简单,效果 ...

  3. .Net 通过Cmd执行Adb命令 /c参数

    通过cmd.exe来执行adb命令,可以进行一些命令组合,直接用adb.exe的话只能执行单个adb命令 这里要注意cmd 中的/c参数,指明此参数时,他将执行整个字符串中包含的命令并退出当前cmd运 ...

  4. 算法之--字符串包含【python实现】

    题目描述 给定两个分别由字母组成的字符串A和字符串B,字符串B的长度比字符串A短.请问,如何最快地判断字符串B中所有字母是否都在字符串A里? 为了简单起见,我们规定输入的字符串只包含大写英文字母,请实 ...

  5. 1.预处理,生成预编译文件(.文件): Gcc –E hello.c –o hello.i 2.编译,生成汇编代码(.s文件): Gcc –S hello.i –o hello.s 3.汇编,生成目标文件(.o文件): Gcc –c hello.s –o hello.o 4.链接,生成可执行文件: linux笔记

    1 动态查看日志 tail -f filename tail -1000f filename 2 解压当前目录内容为xxx.zip  zip -r xxx.zip ./* 3 查看内存使用情况 fre ...

  6. c# 停靠窗体

    public partial class FrmAnchor : Form, IMessageFilter { public FrmAnchor(Control parentControlc, Con ...

  7. CentOS7 Vim自动补全插件----YouCompleteMe安装与配置

    最近刚装了新系统CentOS7,想要把编码环境配置一下,使用Vim编写程序少不了使用自动补全插件,我以前用的是neocomplcache+code_complete+omnicppcomplete.但 ...

  8. java集合框架collection(2)ArrayList和LinkedList

    ArrayList是基于动态数组实现的list,而LinkedList是基于链表实现的list.所以,ArrayList拥有着数组的特性,LinkedList拥有着链表的特性. 优缺点 ArrayLi ...

  9. 升级vue全家桶过程记录

    背景 如果你使用了element-ui的el-tabs组件,并且想要单独升级element-ui至2.10.0,你会发现,使用了el-tabs组件的页面只要打开就卡死.原因是element-ui~2. ...

  10. 高并发 Nginx+Lua OpenResty系列(8)——Lua模版渲染

    模版渲染 动态web网页开发是Web开发中一个常见的场景,比如像京东商品详情页,其页面逻辑是非常复杂的,需要使用模板技术来实现.而Lua中也有许多模板引擎,如目前京东在使用的lua-resty-tem ...