[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 ...
随机推荐
- php 使用当前时间点进行时间范围查询
/** * 判断是否是吃早饭时间 */ $nowtime = time(); $start = strtotime('8:30:00'); $end = strtotime('9:30:00'); i ...
- spark-day1
#!/usr/bin/python # -*- coding: utf_8 -*- from pyspark import SparkConf, SparkContext import os, tim ...
- 分享一个根据具体的日期判断星座的PHP函数
其实原理很简单,也就是把所有的星座月份日期范围存储到一个数组中,然后根据日期判断属于哪个范围,这样就得到是哪个星座了. 下面的这个函数写的比较精炼,可以参考一下 function constellat ...
- (数据科学学习手札09)系统聚类算法Python与R的比较
上一篇笔者以自己编写代码的方式实现了重心法下的系统聚类(又称层次聚类)算法,通过与Scipy和R中各自自带的系统聚类方法进行比较,显然这些权威的快捷方法更为高效,那么本篇就系统地介绍一下Python与 ...
- 在linux使用锐捷客户端上网(华中科技大学)
第一步:下载锐捷客户端linux版本,下载网址为http://ncc.hust.edu.cn/cyxz/rzkhd.htm 第二步:解压该包,进入目录 #unzip RG_Supplicant_For ...
- What to do when Enterprise Manager is not able to connect to the database instance (ORA-28001)
摘自:http://dbtricks.com/?p=34 If you are trying to connect to the Oracle enterprise Manger and you ge ...
- rails 中 preload、includes、Eager load、Joins 的区别
Rails 提供了四种不同加载关联数据的方法.下面就来介绍一下. 一.Preload Preload 是以附加一条查询语句来加载关联数据的 User.preload(:posts).to_a # =& ...
- (原)Android到IOS开发的转换(一)
序)闲扯几句 很早就想入手ios开发,但是一直没有机会,个人没有水果机器,上个公司上班的那台mac mini虽然就在我身边,灰都有一层了,但是一直没有机会开机学习下,因为事多,自上一篇文章后,离职后, ...
- 「题目代码」P1029~P1033(Java)
1029 C基础-求解方程 import java.util.*; import java.io.*; import java.math.BigInteger; public class Main { ...
- Vue一些重要的知识点
vue sync修饰(1)双向数据绑定,父子组件之间信息的交互 1⃣️在自组件中使用this.emmit('toFather'),子组件产生一个tofather事件,然后在父组件中通过@进行监听,那么 ...