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。

分类标签 Tags

深度优先搜索 搜索 大陆地区 NOIP全国联赛提高组 2004年

/*
考试的时候没想到剪枝.
只有40分QWQ.
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define MAXN 30
using namespace std;
int s[4][MAXN],c[4][MAXN];
int n,a[MAXN];
bool b[MAXN];
int read(){
int x=0,f=1;char ch;ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
void check(){
int p=0;
for(int i=1;i<=3;i++)
for(int j=1;j<=n;j++){
c[i][j]=a[s[i][j]];
}
for(int j=n;j>=1;j--){
p=(c[1][j+1]+c[2][j+1]+p)/n;
if((c[1][j]+c[2][j]+p)%n!=c[3][j]) return;
}
for(int i=1;i<=n-1;i++){
printf("%d ",a[i]);
}
printf("%d",a[n]);
exit(0);
}
void dfs(int t){
if(t==n+1) {check();return ;}
for(int i=0;i<n;i++)
if(!b[i])b[i]=1,a[t]=i,dfs(t+1),b[i]=0;
}
void slove(){
dfs(1);
}
int main(){
n=read();char ch;
for(int i=1;i<=3;i++)
for(int j=1;j<=n;j++){
cin>>ch;s[i][j]=ch-64;
}
slove();
return 0;
}
/*
搜素+显然的剪枝
全排列时加剪枝.
由题意:
当我们全部知道某位是否进位时,
就可以唯一的确定一组答案.
判断当前字母以前是否出现过判错.
进位数最多为 1.
所以直接(a+b)%n==c||(a+b+1)%n==c;
从右往左,按照字母出现顺序搜索.
*/
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#define MAXN 30
using namespace std;
int s[4][MAXN],c[4][MAXN],w[MAXN*MAXN];
int n,a[MAXN],tot;
bool b[MAXN];
int read(){
int x=0,f=1;char ch;ch=getchar();
while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*f;
}
void check(){
int p=0;
for(int j=n;j>=1;j--){
p=(a[s[1][j+1]]+a[s[2][j+1]]+p)/n;
if((a[s[1][j]]+a[s[2][j]]+p)%n!=a[s[3][j]]) return;
}
for(int i=1;i<=n-1;i++){
printf("%d ",a[i]);
}
printf("%d",a[n]);
exit(0);
}
bool jd(){
for(int i=n;i>=1;i--){
if(a[s[1][i]]!=-1&&a[s[2][i]]!=-1&&a[s[3][i]]!=-1){
if((a[s[1][i]]+a[s[2][i]]+1)%n==a[s[3][i]]||(a[s[1][i]]+a[s[2][i]])%n==a[s[3][i]]) continue;
return false;
}
}
return true;
}
void dfs(int t){
if(t==n+1) {check();return ;}
for(int i=0;i<n;i++){
if(!b[i]){
b[i]=1,a[w[t]]=i;
if(jd())dfs(t+1);
b[i]=0;a[w[t]]=-1;
}
}
}
void slove(){
dfs(1);
}
int main(){
n=read();char ch;
for(int i=1;i<=3;i++)
for(int j=1;j<=n;j++){
cin>>ch;s[i][j]=ch-64;
if(!a[ch-64]){
a[ch-64]=-1;w[++tot]=ch-64;
}
}
slove();
return 0;
}

Codevs 1064 虫食算 2004年NOIP全国联赛提高组的更多相关文章

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

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

  2. codevs 1058 合唱队形 2004年NOIP全国联赛提高组

    1058 合唱队形 2004年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold   题目描述 Description N位同学站成一排,音 ...

  3. 【CodeVS】【2004年NOIP全国联赛提高组】1057 津津的储蓄计划

    1057 津津的储蓄计划 2004年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 青铜 Bronze 题目描述 Description 津津的零花钱一直都是 ...

  4. 1058 合唱队形 2004年NOIP全国联赛提高组

    1058 合唱队形 2004年NOIP全国联赛提高组  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 黄金 Gold 题解  查看运行结果     题目描述 Descripti ...

  5. Codevs 1173 最优贸易 2009年NOIP全国联赛提高组

    1173 最优贸易 2009年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description [问题描述] C 国有n ...

  6. Codevs 1066 引水入城 2010年NOIP全国联赛提高组

    1066 引水入城 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 传送门 题目描述 Description 在一个遥远的国度 ...

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

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

  8. codevs 1057 津津的储蓄计划 2004年NOIP全国联赛提高组 x

     时间限制: 1 s  空间限制: 128000 KB   题目描述 Description 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花 ...

  9. 津津的储蓄计划 2004年NOIP全国联赛提高组

    题目描述 Description 津津的零花钱一直都是自己管理.每个月的月初妈妈给津津300元钱,津津会预算这个月的花销,并且总能做到实际花销和预算的相同. 为了让津津学习如何储蓄,妈妈提出,津津可以 ...

随机推荐

  1. HDU3727 - Jewel(主席树)

    题目大意 对一个序列进行以下四种操作: 1.Insert x 在序列尾部插入x 2.Query_1 s t k 查询区间[s,t]的第k小 3.Query_2 x 查询x的在序列中排名 4.Query ...

  2. Sublime Text 2 使用心得

    一. 前言 作为一个前端,有一款好的开发利器是必不可少的,editplus.notepad++都是不错的工具,体积轻巧,启动迅速(dw太浮肿了).最近,又有一款新的编辑器诞生,席卷前端界,惹得无数喜爱 ...

  3. 用lambda构建ORM查询语句

    本文介绍如何解析lambda表达式来获取一个满足条件的查询语句. 先看个截图  通过设置实体对象Article_Content的查询表达式,就可以获取对应的参数化SQL语句,使用起来很方便,减少了代码 ...

  4. opencv数据结构-MAT结构详解

    1.定义 OpenCV中的C结构体有 CvMat 和 CvMatND,但后续的应用中指出 CvMat 和 CvMatND 弃用了,在C++封装中用 Mat 代替,另外旧版还有一个 IplImage,同 ...

  5. 理解SQL Server中索引的概念

    T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他   简介 在SQL Server中,索引是一种增强式的存在,这意味着,即使没有索引,SQL Server仍然可以实现应有的功能 ...

  6. Jquery UI 组合树 - ComboTree 集成Wabacus4.1 代码剖析

    Jquery UI 1.3 (组合树 - ComboTree ) 集成Wabacus4.1 集成Spring 代码剖析 使用时,请下载需要Jquery ui包进行配置 combotree.js 的代码 ...

  7. Hyper-V介绍

    Hyer-v主机是高端虚拟主机用户的最佳选择.您不再受其他用户程序对您造成的影响,您将得到的是更加公平的资源分配,远远低于虚拟主机的故障率.Hyper-V的分区包含两种:父分区和客户分区.Hyper- ...

  8. FindWindowEx

    procedure CloseGameSver(); var H1, h2: HWND; begin H1 := FindWindow('TForm1', nil); h2 := FindWindow ...

  9. Objective C assign&copy & retain区别

    什么是assign,copy,retain之间的区别? assign: 简单赋值,不更改索引计数(Reference Counting). copy: 建立一个索引计数为1的对象,然后释放旧对象 re ...

  10. MySQL 复制+快照恢复误删除操作实验测试

    下面假定2个场景: 场景1:主从架构,没有延迟,某DBA误操作:drop database [复制+快照:在线备份]场景2:存在不确定性或者风险性较大的操作,如升级测试,大表变更[啥事都在快照上折腾, ...