[Noip2004]虫食算 dfs
搜索问题的关键:优秀的搜索策略以及行之有效的减枝
对于这道题我们阶乘搜肯定不行所以我们按位搜,我们对每一位的三个数进行赋值,然后判解。
对于此一类的搜索乘上一个几十的常数来减枝往往要比直接搜要快得多,因为这样的问题他们都会有一个庞大的"之后",而且判断不存在较为容易,以我们多花一些时间进行减枝往往能达到剪掉许多枝的效果。
搜索还是看感觉,倒搜还是比正搜快......
#pragma GCC optimize("O3")
#include <cstdio>
#include <cstring>
char A[],B[],C[];
int a[],b[],c[],n;
int qian[],hou[],ans[],get[];
bool god;
inline void put_it(){
int len=n;
for(int i=len-;i>=;i--)
a[len-i]=A[i]-'A';
len=strlen(B);
for(int i=len-;i>=;i--)
b[len-i]=B[i]-'A';
len=strlen(C);
for(int i=len-;i>=;i--)
c[len-i]=C[i]-'A';
for(int i=;i<=n;i++)hou[i]=i+,qian[i+]=i;
memset(get,-,sizeof(get)),memset(ans,-,sizeof(ans));
}
inline void dfs(int now,int up){
if(now==n+){
if(!up){
god=;
for(int i=;i<n;i++)printf("%d ",ans[i]);
}
return;
}
if(god)return;
register int temp;
if(ans[a[now]]!=-&&ans[b[now]]!=-){
temp=(ans[b[now]]+ans[a[now]]+up)%n;
if(ans[c[now]]==-&&get[temp]==-)
get[temp]=,ans[c[now]]=temp,dfs(now+,(ans[b[now]]+ans[a[now]]+up)/n),get[temp]=-,ans[c[now]]=-;
else if(ans[c[now]]!=-&&(temp==ans[c[now]]))
dfs(now+,(ans[b[now]]+ans[a[now]]+up)/n);
if(god)return;
return;
}
if(ans[a[now]]==-&&ans[b[now]]==-){
if(a[now]==b[now]){
for(int i=qian[n+];i>;i=qian[i]){
if(get[i-]!=-)continue;
hou[qian[i]]=hou[i],qian[hou[i]]=qian[i],get[i-]=;
ans[a[now]]=i-;
temp=(ans[b[now]]+ans[a[now]]+up)%n;
if(ans[c[now]]==-&&get[temp]==-)
get[temp]=,ans[c[now]]=temp,dfs(now+,(ans[b[now]]+ans[a[now]]+up)/n),get[temp]=-,ans[c[now]]=-;
else if(ans[c[now]]!=-&&(temp==ans[c[now]]))
dfs(now+,(ans[b[now]]+ans[a[now]]+up)/n);
if(god)return;
ans[a[now]]=-;
hou[qian[i]]=i,qian[hou[i]]=i,get[i-]=-;
}
return;
}
for(int i=qian[n+];i>;i=qian[i]){
if(get[i-]!=-)continue;
hou[qian[i]]=hou[i],qian[hou[i]]=qian[i],get[i-]=;
ans[a[now]]=i-;
for(int j=qian[n+];j>;j=qian[j]){
if(get[j-]!=-)continue;
hou[qian[j]]=hou[j],qian[hou[j]]=qian[j],get[j-]=;
ans[b[now]]=j-;
temp=(ans[b[now]]+ans[a[now]]+up)%n;
if(ans[c[now]]==-&&get[temp]==-)
get[temp]=,ans[c[now]]=temp,dfs(now+,(ans[b[now]]+ans[a[now]]+up)/n),get[temp]=-,ans[c[now]]=-;
else if(ans[c[now]]!=-&&(temp==ans[c[now]]))
dfs(now+,(ans[b[now]]+ans[a[now]]+up)/n);
if(god)return;
ans[b[now]]=-;
hou[qian[j]]=j,qian[hou[j]]=j,get[j-]=-;
}
if(god)return;
ans[a[now]]=-;
hou[qian[i]]=i,qian[hou[i]]=i,get[i-]=-;
}
return;
}
if(ans[b[now]]!=-){
for(int i=qian[n+];i>;i=qian[i]){
if(get[i-]!=-)continue;
hou[qian[i]]=hou[i],qian[hou[i]]=qian[i],get[i-]=;
ans[a[now]]=i-;
temp=(ans[b[now]]+ans[a[now]]+up)%n;
if(ans[c[now]]==-&&get[temp]==-)
get[temp]=,ans[c[now]]=temp,dfs(now+,(ans[b[now]]+ans[a[now]]+up)/n),get[temp]=-,ans[c[now]]=-;
else if(ans[c[now]]!=-&&(temp==ans[c[now]]))
dfs(now+,(ans[b[now]]+ans[a[now]]+up)/n);
if(god)return;
ans[a[now]]=-;
hou[qian[i]]=i,qian[hou[i]]=i,get[i-]=-;
}
return;
}
if(ans[a[now]]!=-){
for(int i=qian[n+];i>;i=qian[i]){
if(get[i-]!=-)continue;
hou[qian[i]]=hou[i],qian[hou[i]]=qian[i],get[i-]=;
ans[b[now]]=i-;
temp=(ans[b[now]]+ans[a[now]]+up)%n;
if(ans[c[now]]==-&&get[temp]==-)
get[temp]=,ans[c[now]]=temp,dfs(now+,(ans[b[now]]+ans[a[now]]+up)/n),get[temp]=-,ans[c[now]]=-;
else if(ans[c[now]]!=-&&(temp==ans[c[now]]))
dfs(now+,(ans[b[now]]+ans[a[now]]+up)/n);
if(god)return;
ans[b[now]]=-;
hou[qian[i]]=i,qian[hou[i]]=i,get[i-]=-;
}
return;
}
}
int main(){
scanf("%d%s%s%s",&n,A,B,C),put_it(),dfs(,);
return ;
}
[Noip2004]虫食算 dfs的更多相关文章
- NOIP2004 虫食算
描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子:43#9865#045+ 8468#6633= 44445506678其中#号代表 ...
- [BZOJ1902]:[NOIP2004]虫食算(搜索)
题目传送门 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母. 来看一个简单的例子: 43#98650#45+8468#6633=444455069 ...
- Luogu1092 NOIP2004虫食算(搜索+高斯消元)
暴力枚举每一位是否进位,然后就可以高斯消元解出方程了.然而复杂度是O(2nn3),相当不靠谱. 考虑优化.注意到某一位进位情况的变化只会影响到方程的常数项,于是可以在最开始做一次高斯消元算出每个未知数 ...
- NOIP 2004 虫食算题解
问题 E: [Noip2004]虫食算 时间限制: 1 Sec 内存限制: 128 MB 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一 ...
- [NOIP2004] 提高组 洛谷P1092 虫食算
题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...
- 洛谷 P1092 虫食算 Label:dfs
题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 其中# ...
- 【NOIP2004】【CJOJ1703】【洛谷1092】虫食算
题面 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +8468#6633 44445509678 ...
- 【NOIP2004】虫食算
Description 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: 43#9865#045 +. 8468#6633 444455 ...
- 虫食算 2004年NOIP全国联赛提高组(dfs)
1064 虫食算 2004年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Descrip ...
随机推荐
- 小程序开发-7-访问api数据与ES6在小程序中的应用
访问API数据与ES6在小程序中的应用 看待组件的两种观点 组件复用 代码分离-(特别重要) 不能在一个页面写所有的代码,代码分离具有很强的可读性.可维护性 Blink Api 介绍与测试API ur ...
- Rmarkdown:输出html设置
在Rstudio中可自行更改主题样式 --- title: "题目" author: "name" date: "`r format(Sys.time ...
- Xcode9新变化
http://www.cnblogs.com/lurenq/archive/2017/09/26/7594909.html
- 【WPF】创建基于模板的WPF控件(经典)
原文:[WPF]创建基于模板的WPF控件(经典) WPF可以创建两种控件,它们的名字也很容易让人混淆:用户控件(User Control)和定制控件(Customer Control),之所以如此命名 ...
- PIC32MZ 通过USB在线升级 -- USB CDC bootloader
了解bootloader 的实现,请加QQ: 1273623966 (验证填 bootloader):欢迎咨询或定制bootloader:我的博客主页www.cnblogs.com/geekygeek ...
- Android2.2以上的版本HttpURLConnection.getContentLength()获取的size跟下载下来的file的legth不相等
2.2以上的版本下载网络资源不完整无法更新.HttpURLConnection.getContentLength()获取的size跟下载下来的file的legth不等. 原因是:HttpURLConn ...
- Linux-Shell脚本编程-学习-3-Shell编程-shell脚本基本格式
前面两篇文章基本介绍了一部分linux下的基本命令,后面还需要大家自行了解下linux的文件系统的磁盘管理部分,这里就不在写了. 什么是shell编程,我也解释不来,什么是shell脚本了,我理解就是 ...
- [nginx] OpenResty 学习手册
OpenResty Installation Find tar.gz : https://openresty.org/cn/download.html tar -xzvf openresty-VERS ...
- 第一周 Introduction
欢迎 欢迎来到这门关于机器学习的免费网络课程,机器学习是近年来最激动人心的技术之一,在这门课中,你不仅可以了解机器学习的原理,更有机会进行实践操作,并且亲自运用所学的算法. 每天你都可能在不知不觉中使 ...
- php中数据类型的强制转换
1.在PHP开发种在很多的地方要涉及到数据类型的转换,尤其是涉及到金额的数据类型,一定要转换成float类型,否则在入库的时候可能会因为数据类型的不同覆盖掉之前的金额.(字符串和float类型相加) ...