codevs 1064 虫食算

2004年NOIP全国联赛提高组

 时间限制: 2 s
 空间限制: 128000 KB
 题目等级 : 钻石 Diamond
 
题目描述 Description

所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子:

43#9865#045
    +    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个不同的字母分别代表的数字,使得该加法算式成立。输入数据保证有且仅有一组解,

输入描述 Input Description

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

输出描述 Output Description

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

样例输入 Sample Input

5
ABCED
BDACE
EBBAA

样例输出 Sample Output

1 0 3 4 2

数据范围及提示 Data Size & Hint

对于30%的数据,保证有N<=10;
对于50%的数据,保证有N<=15;
对于全部的数据,保证有N<=26。

 /*这个题目需要注意的细节很多,尤其是jw[k]==0的回溯一定不能忘记*/
#include<iostream>
using namespace std;
#include<cstdio>
#include<cstring>
#include<cstdlib>
int atos['Z'+];
char jz[][];
bool flag[]={};
int n;
int jw[]={};
void dfs(int k,int p)
{
for(int i=;i<=n;++i)
{
if(atos[jz[][i]]>=&&atos[jz[][i]]>=&&atos[jz[][i]]>=)
{
int p=atos[jz[][i]]+atos[jz[][i]];
if(p%n!=atos[jz[][i]]&&(p+)%n!=atos[jz[][i]])
return;
}
}
if(k<=)
{
printf("%d",atos['A']);
for(int i='B';i<='A'+n-;++i)
printf(" %d",atos[i]);
printf("\n");
exit();
}
if(p==)
{
int temp=atos[jz[][k]]+atos[jz[][k]]+jw[k+];
if(atos[jz[][k]]>=)
{
if(atos[jz[][k]]==temp)
{
dfs(k-,);
}
else if(atos[jz[][k]]+n==temp)
{
jw[k]=;
dfs(k-,);
jw[k]=;
}else return;
}
else
{
if(temp>=n)
{
jw[k]=;
temp-=n;
}
if(!flag[temp])
{
flag[temp]=true;
atos[jz[][k]]=temp;
dfs(k-,);
flag[temp]=false;
atos[jz[][k]]=-;
}
jw[k]=;/*前面一开始写了一个if(flag[temp]) return 结果jw没被重置,倒数第二组数据,就错了*/
} }else if(p==)
{
if(atos[jz[][k]]>=)
{
dfs(k,);
}
else {
for(int j=;j<=n-;++j)
{
if(!flag[j])
{
flag[j]=true;
atos[jz[][k]]=j;
dfs(k,);
flag[j]=false;
atos[jz[][k]]=-;
}
}
}
}
else if(p==)
{
if(atos[jz[][k]]>=)
{
dfs(k,);
}
else {
for(int j=;j<=n-;++j)
{
if(!flag[j])
{
flag[j]=true;
atos[jz[][k]]=j;
dfs(k,);
flag[j]=false;
atos[jz[][k]]=-;
}
}
}
}
}
int main()
{
scanf("%d",&n);
for(int i=;i<=;++i)
scanf("%s",jz[i]+);
memset(atos,-,sizeof(atos));
dfs(n,);
return ;
}

深度优先搜索 codevs 1064 虫食算的更多相关文章

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

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

  2. 【搜索】$P1092$虫食算

    题目链接 首先,我们只考虑加法的虫食算.这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0. 其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同 ...

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

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

  4. 虫食算(codevs 1064)

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

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

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

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

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

  7. 洛谷 P1092 虫食算 Label:dfs

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

  8. codevs1064 虫食算

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

  9. NOIP2004 虫食算

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

随机推荐

  1. 使用PreparedStatement执行SQL语句时占位符(?)的用法

    1.Student数据库表 ID  name gender       2.Java代码 public static void main(String[] args) { int _id=1; Str ...

  2. jQuery获取Select选择的Text和 Value(转)用时比较方便寻找

    ---恢复内容开始--- jQuery获取Select选择的Text和Value:语法解释:1. $("#select_id").change(function(){//code. ...

  3. php5.6-Apache2.4-mysql5.6环境配置(win7_64位)

    ----------------------------------------------------- ★软件工具:(下载时注意下载相应版本,不同版本安装细节可能会有差异!!) 1>http ...

  4. isEmpty与null、""的区别

    前一段时间我阅读别人的代码,发现有的时候用isEmpty,有的时候用null,有的时候用"".我很困惑三者之间的区别,于是我就自己写了一个程序来验证一下 public class ...

  5. LCA算法倍增算法(洛谷3379模板题)

    倍增(爬树)算法,刚刚学习的算法.对每一个点的父节点,就记录他的2k的父亲. 题目为http://www.luogu.org/problem/show?pid=3379 第一步先记录每一个节点的深度用 ...

  6. 怎样让js循环重复执行过程

    setInterval(function(){ cc();},60000);setInterval是每隔一分钟就执行一次方法体,主要特点是循环不断的执行.而setTimeout是执行一次就不会继续执行 ...

  7. NLog 自定义字段 写入 oracle

    1.通过Nuget安装NLog 下载,简单入门 请参照 我刚才转的几篇文章,下面我直接贴代码 2.建表语句 create table TBL_LOG ( id ) not null, appname ...

  8. RGui的http代理设置

    办公电脑环境需要http代理访问大网,使用R语言安装包时老是无法连接网络,后来从网上发现解决方法很简单,只需在启动RGui.exe的命令行上加上启动参数就可以了. "C:\Program F ...

  9. 字符串匹配--Karp-Rabin算法

    主要特征 1.使用hash函数 2.预处理阶段时间复杂度O(m),常量空间 3.查找阶段时间复杂度O(mn) 4.期望运行时间:O(n+m) 本文地址:http://www.cnblogs.com/a ...

  10. 《C程序设计的抽象思维》1.9编程练习

    本文地址:http://www.cnblogs.com/archimedes/p/programming-abstractions-in-c-1.html,转载请注明源地址. 1.温度转换: #inc ...