题目描述

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

43#9865#045

+8468#6633

44445509678

其中#号代表被虫子啃掉的数字。根据算式,我们很容易判断:第一行的两个数字分别是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个不同的字母分别代表的数字,使得该加法算式成立。输入数据保证有且仅有一组解

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:

5
ABCED
BDACE
EBBAA
输出样例#1:

1 0 3 4 2

说明

对于30%的数据,保证有N<=10;

对于50%的数据,保证有N<=15;

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

noip2004提高组第4题

强大的搜索。

基本思想就是枚举每个字母代表的值,并且带入计算。

把每一列当做一个整体处理,从低位往高位扫(方便计算进位)。

有一个很强的剪枝:当发现高位的某一列三个数都填上以后,如果两个加数不管进不进位都不能得到填上去的和,说明方案肯定不可行,直接剪枝。具体看代码。

 /*by SilverN*/
#include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<cmath>
using namespace std;
char s[];
int n;
int a[],b[],c[];
int w[];//字母对应数字
bool vis[];
bool DFS(int p,int tmp){
if(!p){
if(tmp)return ;
return ;
}
int i,j,k;
for(k=p;k;--k){
if(w[a[k]]!=- && w[b[k]]!=- && w[c[k]]!=- &&
( (w[a[k]]+w[b[k]])%n!=w[c[k]] && (w[a[k]]+w[b[k]]+)%n!=w[c[k]] ) ) return ;
}
if(w[a[p]]!=- && w[b[p]]!=-){
int tp1=w[a[p]]+w[b[p]]+tmp;
if(w[c[p]]!=-){
if(tp1%n!=w[c[p]])return ;
else return DFS(p-,tp1/n);
}
else{
int tg=tp1%n;if(vis[tg])return ;
w[c[p]]=tg; vis[tg]=;
if(DFS(p-,tp1/n))return ;
w[c[p]]=-; vis[tg]=;
return ;
}
}
for(register int i=n-;i>=;--i){//a
if(vis[i] && w[a[p]]!=i)continue;
if(w[a[p]]!=- && i!=w[a[p]])continue;
for(register int j=n-;j>=;--j){//b
if(vis[j] && w[b[p]]!=j)continue;
if(w[b[p]]!=- && j!=w[b[p]])continue;
k=(i+j+tmp)%n;//c
if(w[c[p]]!=- && k!=w[c[p]])continue;
if(vis[k] && w[c[p]]!=k)continue;
int tp1=i+j+tmp;
int cp1=w[a[p]];
int cp2=w[b[p]];
int cp3=w[c[p]];
bool vp1=vis[i];
bool vp2=vis[j];
bool vp3=vis[k];
w[a[p]]=i;vis[i]=;
w[b[p]]=j;vis[j]=;
w[c[p]]=k;vis[k]=;
if(DFS(p-,tp1/n))return ;
w[a[p]]=cp1;vis[i]=vp1;
w[b[p]]=cp2;vis[j]=vp2;
w[c[p]]=cp3;vis[k]=vp3;
} }
return ;
}
int main(){
memset(w,-,sizeof w);
scanf("%d",&n);
int i,j;
scanf("%s",s+);
for(i=;i<=n;i++)a[i]=s[i]-'A'+;
scanf("%s",s+);
for(i=;i<=n;i++)b[i]=s[i]-'A'+;
scanf("%s",s+);
for(i=;i<=n;i++)c[i]=s[i]-'A'+;
DFS(n,);
for(i=;i<=n;i++)printf("%d ",w[i]);
return ;
}

最新文章

  1. 我的第一个GitHub仓库
  2. os和sys模块
  3. 分享Kali Linux 2016.2第47周镜像
  4. 读取接口XML和批量导入数据SqlBulkCopy
  5. .NET Framework 高级开发
  6. 云计算之路-阿里云上:2014年6月12日12点IIS请求到达量突降
  7. Python socket 详解
  8. jquery 里面的$(document).ready 和 DOMContentLoaded
  9. SQL最简单分类简介
  10. 网页版 treeview使用中遇到的问题
  11. 本地apt
  12. .net学习路线
  13. Cassandra Issue with Tombstone
  14. android Git命令家底儿及Git数据通信原理详解
  15. SharePoint 2010 之寻找页面布局
  16. Python中字符串二三事
  17. 锁定表头和固定列(Fixed table head and columns)
  18. NOIP2015题解
  19. Python练习六
  20. 招聘IT图书兼职作者(长期兼职)

热门文章

  1. 转 php中$_request与$_post、$_get的区别
  2. 构建一个.net的干货类库,以便于快速的开发 - 验证码
  3. AngularJS入门 &amp; 分页 &amp; CRUD示例
  4. 平衡图片负载,提升web站点访问体验
  5. js实现元素水平垂直居中
  6. Echarts生成饼状图、条形图以及线形图 JS封装
  7. 对gridview绑定数据的操作方法及自定义显示内容
  8. 【译】x86程序员手册36-9.9异常汇总
  9. python远程控制电脑
  10. H5 canvas-小球抛物线