[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 ...
随机推荐
- vi/vim连续注释
知识点: 1-可视块模式方法 2-替换方法 3-自定义快捷键方式 今天刚好重新在linux上手工搭建完Lamp环境,用来下vi操作,一段时间不用就有些生疏了,正好经常要注释,回顾下自己会的方法,小结一 ...
- windows和Ubuntu下安装mongodb
windows 下载 mongodb官网下载压缩版安装包:下载地址:https://www.mongodb.com/download-center/community 注意选择版本(目前windows ...
- JAVA 基础编程练习题
1 [程序 1 不死神兔] 题目:古典问题:有一对兔子,从出生后第 3 个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问每个月的兔子对数为多少?程序分析: 兔子的规 ...
- centos配置npm全局安装
使用-g全局安装在服务器需要配置,下面看看配置方法 配置全局安装路径和缓存路径 cd /usr/local/nodejs mkdir node_global mkdir node_cache npm ...
- AWS安装CDH5.3-CentOS6.4
1.下载CM启动文件 [root@ip-172-31-23-107 ec2-user]# wget http://archive.cloudera.com/cm5/installer/latest/c ...
- SpringCloud项目,接口调用返回http 500 - Internal Server Error的错误
今天上班的时候,自己正在参与的Spring Cloud项目出现了问题,原本上周五还正常的项目突然所有接口调用都是返回http 500的错误. 项目的状态是在Eureka上可以看到对应微服务是在线状态, ...
- 关于springboot 打包问题 jar包和 war包
起因:项目开发完成 需要打包部署了 发现自己不会打包 那么开始网上学习打包? 那么怎么来打包那? 我们以前没有采用springboot 时候我们都是直接将项目打成war包形式 然后放到tomc ...
- 解析HTML利器AngleSharp介绍
解析HTML利器AngleSharp介绍 AngleSharp是基于.NET(C#)开发的专门为解析xHTML源码的DLL组件. 项目地址:https://github.com/FlorianRapp ...
- Unity5.6偶尔不能创建项目解决办法
Unity5.6偶尔启动后,不能创建项目,解决办法如下: 1.打开Unity 2.在开始窗口退出当前登录的账户 3.重新登录 4.然后就可以创建新项目了 5.如果以上方法不生效,关闭Unity再重试一 ...
- C#里的指针
最近在复习C#基础这里,发现指针运算方式跟引用类型运算方式很相像. 指针里面存放的是表示内存地址的一段整数,所以任何整数类型指针之间都可以相互转换,因此带来了不安全性. ; long* b = &am ...