[NOIP2004提高组]虫食算
题目:洛谷P1092、codevs1064、Vijos P1099。
题目大意:
给你一个$n$进制、每个数都是$n$位的三个数a,b,c,这些数的数位由字母表示(共$n$个字母,从‘A’开始),所有数字都只对应一个字母,每个字母对应一个数字。
现在知道a+b=c,求每个字母代表的数字,保证有且仅有一组解。
解题思路:
暴力,从后往前搜索每一列即可。注意传递进位。
若一列知道了三个数,则判断是否合法,合法则继续搜索下一列。
若一列知道了两个数,则可以推算出第三个数,若没被使用,则继续搜索下一列。
若一列知道的数少于一个,则a或b中,一定有一个数字是不知道的。我们从大到小枚举那个数的值,然后搜**当前列**(递归)。
如果发现答案可行,则直接输出答案,退出即可。
这样搜,不用加其他剪枝,最大一个点最多800ms(其实上述分类讨论已经很好地进行了剪枝)。
C++ Code:
#include<bits/stdc++.h>
int n,num[123],ur[123];
char a[123],b[132],c[213];
void dfs(int now,int jw){
if(now==-1){
for(int i=1;i<n;++i)printf("%d ",num[i+'A'-1]);
printf("%d\n",num[n+'A'-1]);
exit(EXIT_SUCCESS);
}
int i=now;
//if(now!=n-1&&!check(now+1))return;
if(num[a[i]]!=-1&&num[b[i]]!=-1&&num[c[i]]!=-1){
int p=num[a[i]]+num[b[i]]+jw;
if(p%n==num[c[i]]){
dfs(now-1,p/n);
}
return;
}
if(num[a[i]]!=-1&&num[b[i]]!=-1){
int p=num[a[i]]+num[b[i]]+jw;
if(!ur[p%n]){
ur[p%n]=1;
num[c[i]]=p%n;
dfs(now-1,p/n);
num[c[i]]=-1;
ur[p%n]=0;
}
return;
}
if(num[a[i]]!=-1&&num[c[i]]!=-1){
int p=num[c[i]]-jw-num[a[i]]+n;
if(!ur[p%n]){
ur[p%n]=1;
num[b[i]]=p%n;
dfs(now-1,!(p/n));
num[b[i]]=-1;
ur[p%n]=0;
}
return;
}
if(num[b[i]]!=-1&&num[c[i]]!=-1){
int p=num[c[i]]-jw-num[b[i]]+n;
if(!ur[p%n]){
ur[p%n]=1;
num[a[i]]=p%n;
dfs(now-1,!(p/n));
num[a[i]]=-1;
ur[p%n]=0;
}
return;
}
if(num[a[i]]!=-1){
for(int j=n-1;j>-1;--j)
if(!ur[j]){
ur[j]=1;
num[b[i]]=j;
dfs(now,jw);
num[b[i]]=-1;
ur[j]=0;
}
}else{
for(int j=n-1;j>-1;--j)
if(!ur[j]){
ur[j]=1;
num[a[i]]=j;
dfs(now,jw);
num[a[i]]=-1;
ur[j]=0;
}
}
}
int main(){
scanf("%d%s%s%s",&n,a,b,c);
memset(ur,0,sizeof ur);
memset(num,-1,sizeof num);
dfs(n-1,0);
return EXIT_FAILURE;
}
[NOIP2004提高组]虫食算的更多相关文章
- 【NOIp2004提高组】食虫算 题解
所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 + 8468#6633 44445509678 其中#号代表被 ...
- [NOIP2004] 提高组 洛谷P1092 虫食算
题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...
- Codevs 1064 虫食算 2004年NOIP全国联赛提高组
1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description 所谓虫食算,就是原先的算式 ...
- 虫食算 2004年NOIP全国联赛提高组(dfs)
1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Descrip ...
- 【NOIP2004】【CJOJ1703】【洛谷1092】虫食算
题面 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 ...
- NOIP2004 虫食算
描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子:43#9865#045+ 8468#6633= 44445506678其中#号代表 ...
- [BZOJ1902]:[NOIP2004]虫食算(搜索)
题目传送门 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母. 来看一个简单的例子: 43#98650#45+8468#6633=444455069 ...
- 【NOIP2004】虫食算
Description 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +. 8468#6633 444455 ...
- 洛谷 P1092 虫食算 Label:dfs
题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...
随机推荐
- element合并单元格方法及遇到问题的解决办法
效果如图: 代码如下 <!-- 查看选课 --> <template> <div> <el-table :data="listData" ...
- 【JavaScript框架封装】实现一个类似于JQuery的缓存框架的封装
// 缓存框架 (function (xframe) { /** * 实现了缓存框架的临时存储功能(内存存储) * @type {{data: Array, get: (function(*): *) ...
- P3369 【模板】普通平衡树 (splay 模板)
题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下操作: 插入x数 删除x数(若有多个相同的数,因只删除一个) 查询x数的排名(排名定义为比当前数小的数的个数+1.若有多 ...
- ORA-12560: TNS: 协议适配器错误(oracle service 已启动)
如果是安装完 oracle 客户端之后才出现的这个问题,请往下看 安装 oracle client 时,会配置一个客户端的监听,如果电脑上之前安装过 oracle service 就会和服务的监听冲突 ...
- 【hiho一下 第三周】KMP算法
[题目链接]:http://hihocoder.com/problemset/problem/1015 [题意] [题解] 把f数组,len1,len2数组一开始全都定义成char型 这酸爽. [Nu ...
- C#--职业路线图
非常好的一个C#的职业技术路线图
- memcached—向memcached中保存Java实体需注意的问题
今天以代码实例的形式总结一下向memcached中保存Java实体需注意的问题: memcached工具类代码: package com.ghj.packageoftool; import java. ...
- c7---函数
// // main.c // 函数练习 // // Created by xiaomage on 15/6/7. // Copyright (c) 2015年 xiaomage. All right ...
- php实现简单的学生管理系统
php实现学生管理系统 一.效果 二.代码框架 functions文件夹里面是封装的mysqli的数据库操作函数和一个跳转的函数 student文件夹里面就是学生管理系统的主界面 applicatio ...
- tcpdump dns流量监控
tcpdump监听数据 为了看清楚DNS通信的过程,下面我们将从主机1:192.168.0.141上运行host命令以查询主机www.jd.com对应的IP地址,并使用tcpdump抓取这一过程中LA ...