题目:洛谷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提高组]虫食算的更多相关文章

  1. 【NOIp2004提高组】食虫算 题解

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

  2. [NOIP2004] 提高组 洛谷P1092 虫食算

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

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

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

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

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

  5. 【NOIP2004】【CJOJ1703】【洛谷1092】虫食算

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

  6. NOIP2004 虫食算

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

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

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

  8. 【NOIP2004】虫食算

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

  9. 洛谷 P1092 虫食算 Label:dfs

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

随机推荐

  1. 佛祖保佑,永不宕机,永无 Bug

    转自:http://top.jobbole.com/17580/ 佛祖保佑,永不宕机,永无 Bug 为何服务器频遭黑客攻击?为何系统频频宕机,别人家系统却稳如泰山,坚如磐石?为何运维人员和系统管理员行 ...

  2. HDU 5322 Hope (分治NTT优化DP)

    题面传送门 题目大意: 假设现在有一个排列,每个数和在它右面第一个比它大的数连一条无向边,会形成很多联通块. 定义一个联通块的权值为:联通块内元素数量的平方. 定义一个排列的权值为:每个联通块的权值之 ...

  3. [网络流24题] 方格取数问题/骑士共存问题 (最大流->最大权闭合图)

    洛谷传送门 LOJ传送门 和太空飞行计划问题一样,这依然是一道最大权闭合图问题 “骑士共存问题”是“方格取数问题”的弱化版,本题解不再赘述“骑士共存问题”的做法 分析题目,如果我们能把所有方格的数都给 ...

  4. 运用cat EOF添加文件

    [root@fyc14 nginx1]# cat <<EOF > /etc/yum.repos.d/nginx.repo> [nginx]> name=nginx rep ...

  5. MyEclipse 2014 有用的几个快捷键

    ctrl+h  fileSearch ------------------------------------- MyEclipse 快捷键1(CTRL) ---------------------- ...

  6. Ubuntu中打开RAR文件

    在安装完ubuntu后,默认是不支持RAR文档的,当用鼠标双击一个RAR文档的时候会给我们上面的提示! 如果想打开RAR的文档就需要安装一个RAR解析,方法是打开终端,输入: 复制代码代码如下: su ...

  7. jQuery(Dom节点操作)

  8. Using index, using temporary, using filesort - how to fix this?

    解释一: These are the following conditions under which temporary tables are created. UNION queries use ...

  9. rabbitMQ学习笔记(一)Windows 与Linux下rabbitMQ的安装

    版权声明:本文为博主原创文章,未经博主允许不得转载. Normal 0 7.8 磅 0 2 false false false EN-US ZH-CN X-NONE /* Style Definiti ...

  10. (译)RabbitMQ ——“Hello World”

    原文地址:http://www.rabbitmq.com/tutorials/tutorial-one-dotnet.html 介绍 RabbitMQ是一个消息实体服务(broker):它接收及转发消 ...