codevs1064 虫食算
所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母。来看一个简单的例子:
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。
仔细查了一下错,发现又犯低级错误了。首先我的下标从0开始那么我的搜索边界应该是-1,然而我只到了0,导致有个解没搜到。然后我打的只是裸搜索,没有一个很优秀的剪枝,就是每一步都check一下,还没搜到的等式是不是已经三个都出来了,如果已经都确定了,但是不管进不进位都无法做到的话,那就说明不合法,可以直接return。这样剪枝的话就跑得很快了,基本0.008s就可以过了。
其余的就是裸搜索啦:
//It is made by jump~
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
using namespace std;
typedef long long LL;
#define RG register
const int MAXN = ;
int n,ce,a[MAXN],b[MAXN],c[MAXN];
int match[MAXN],ans[MAXN];
char ch[MAXN];
bool ok,vis[MAXN]; inline int getint()
{
RG int w=,q=; RG char c=getchar();
while((c<'' || c>'') && c!='-') c=getchar(); if(c=='-') q=,c=getchar();
while (c>='' && c<='') w=w*+c-'', c=getchar(); return q ? -w : w;
} inline void dfs(RG int x,RG int type,RG int remain){
if(ok) return ; RG int ans1,ans2,ans3;
for(int i=;i<x;i++) {//进位最多是ce,如果某一位已经确定,但是进位不够则不合法
ans1=match[a[i]],ans2=match[b[i]],ans3=match[c[i]];
if(ans1==-||ans2==-||ans3==-) continue;
if( ((ans3-ans2-ans1)%n+n)%n >ce) return ;
} if(x==-) {//!!!!!!!
for(RG int i=;i<n;i++) { ans[i]=match[i]; if(match[i]==-) return ; }
ok=true; return ;
}
if(type==) {//搜第一个
if(match[a[x]]!=-) dfs(x,type+,remain);
else{
for(RG int i=n-;i>=;i--) {
if(vis[i]) continue;
vis[i]=; match[a[x]]=i; dfs(x,type+,remain);
vis[i]=; match[a[x]]=-;
}
}
}
else{//搜第二个加数的这一位
ans1=match[a[x]],ans2=match[b[x]],ans3=match[c[x]];
if(ans2!=-) {
RG int sheng=ans1+ans2+remain;
if(sheng%n==ans3) dfs(x-,,sheng/n);
else if(ans3==-) {
vis[sheng%n]=; match[c[x]]=sheng%n; dfs(x-,,sheng/n);
vis[sheng%n]=; match[c[x]]=-;
}
}
else{
RG int cc,ss;
for(RG int i=n-;i>=;i--) {
if(vis[i]) continue;
ss=ans1+i+remain; cc=ss%n;
if(cc!=ans3 && ans3!=-) continue;
if(ans3==-) {
if(vis[cc]) continue;
vis[cc]=; match[c[x]]=cc;
}
vis[i]=; match[b[x]]=i;
dfs(x-,,ss/n);
vis[i]=; match[b[x]]=-;
if(ans3==-) {
vis[cc]=; match[c[x]]=-;
}
}
}
}
} inline void work(){
n=getint(); for(RG int i=;i<=n;i++) match[i]=-; ce=*n-; ce/=n;
scanf("%s",ch); for(RG int i=;i<n;i++) a[i]=ch[i]-'A';
scanf("%s",ch); for(RG int i=;i<n;i++) b[i]=ch[i]-'A';
scanf("%s",ch); for(RG int i=;i<n;i++) c[i]=ch[i]-'A';
ok=false; dfs(n-,,);
printf("%d",ans[]); for(RG int i=;i<n;i++) printf(" %d",ans[i]);
} int main()
{
work();
return ;
}
codevs1064 虫食算的更多相关文章
- 洛谷 P1092 虫食算 Label:dfs
题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...
- 深度优先搜索 codevs 1064 虫食算
codevs 1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 所 ...
- NOIP2004 虫食算
描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子:43#9865#045+ 8468#6633= 44445506678其中#号代表 ...
- Codevs 1064 虫食算 2004年NOIP全国联赛提高组
1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 所谓虫食算,就是原先的算式 ...
- Luogu P1092 虫食算
题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...
- 【NOIP2004】【CJOJ1703】【洛谷1092】虫食算
题面 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 ...
- 【NOIP2004】虫食算
Description 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +. 8468#6633 444455 ...
- 洛谷P1092 虫食算
P1092 虫食算 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: http://paste.ubuntu.com/2544 ...
- 【题解】 P1092虫食算
[题解]P1092 虫食算 老题了,很经典. 用到了一些搜索套路. 可行性剪枝,劣者靠后,随机化,\(etc......\) 搜索设参也很有技巧,设一个\(adjustment\)参数可以很方便地在两 ...
随机推荐
- Linux环境安装Jenkins
安装环境: CenOS 6.4 JDK_1.6.0_23 一.安装前检查环境 检查是否安装JDK: java --version 二.安装Jenkins 1. 添加Jenkins的源(reposito ...
- Apache Shiro 开源权限框架
在 Web 项目中应用 Apache Shiro 开源权限框架 Apache Shiro 是功能强大并且容易集成的开源权限框架,它能够完成认证.授权.加密.会话管理等功能.认证和授权为权限控制的核心, ...
- Corotational 模型代码
今天看了Corotational模型的代码. 在Vega中,获得模型内力的方法是先构造一个ForceModel对象,再调用其对应方法. 对于Corotational模型,构造的流程为: 构造Corot ...
- .NET 知识
1.读懂IL代码就这么简单 IL是.NET框架中中间语言(Intermediate Language)的缩写.使用.NET框架提供的编译器可以直接将源程序编译为.exe或.dll文件,但此时编译出来的 ...
- 【转】【SEE】基于SSE指令集的程序设计简介
SSE技术简介 Intel公司的单指令多数据流式扩展(SSE,Streaming SIMD Extensions)技术能够有效增强CPU浮点运算的能力.Visual Studio .NET 2003提 ...
- Go Walk教程 - 流程控制( switch)
Go的 switch 非常灵活,表达式不必是常量或整数,执行的过程从上至下,直到找到匹配项,不要break: var score =98 var result string switch score/ ...
- 待整理-coredump
Linux下如何产生coredump(gdb调试用) 任务发生异常,需要记录遗言信息,利用gdb调试,因此需要记录coredump文件.设置查看:在root用户下执行sysctl -a | grep ...
- JS调试加断点
js在回调函数执行时直接就跳过了,想看下回调函数也看不了,调试的debug代码一时半会儿想不起来,找了几分钟找到了,还是记一下好. 1 debugger;
- ios 定位 航向检测
// ViewController.m // CoreLocation框架的基本使用—定位 // 注意 点: 1.设置地位可用 2. 设置允许本程序定位(对弹出的框,允许即可) 3. 为模拟器 设置位 ...
- Navicat for mysql 显示中文乱码问题
使用navicat for mysql 打开数据库时,使用Console插入和查询数据显示乱码 处理过程 1.查看数据库编码为" utf8 -- UTF-8 Unicode",也就 ...