题目链接

P1092 虫食算

解题思路

好题啊!这个搜索好难写......

大概是要考虑进位和考虑使用过某个数字这两个东西,但就很容易出错......

首先这个从后往前搜比较好想,按照从后往前出现的顺序搜,在这个剪枝条件下速度会快很多。

比如样例,

5

ABCED

BDACE

EBBAA

从右往左出现的次序是\(DEAECACABBDBABE\),去重之后是\(DEACB\),这就是要搜索的顺序,用\(seq\)记录。

当某时候等式明显已经不满足时,就直接\(return\)。

还有别的剪枝,但这样直接能\(79ms\)。没必要。

AC代码

#include<stdio.h>
#include<stdlib.h>
#define N 30
int n,a[N],b[N],c[N],vis[N],ans[N];
char s[3][N];
int seq[N];//搜索顺序
void dfs(int x){//搜到第x个元素
int i,jw=0;
if(ans[a[0]]+ans[b[0]]>=n)return;
for(i=n-1;i>=0;i--){//从后往前检查
int A=ans[a[i]],B=ans[b[i]],C=ans[c[i]];
if(A==-1||B==-1||C==-1)continue;
if((A+B+1)%n!=C&&(A+B)%n!=C)return;
}
if(x==n){
for(i=n-1;i>=0;i--){
int A=ans[a[i]],B=ans[b[i]],C=ans[c[i]];
if((A+B+jw)%n!=C)return;
jw=(A+B+jw)/n;
}
for(i=0;i<n;i++)printf("%d ",ans[i]);
exit(0);
}
for(i=n-1;i>=0;i--){
if(!vis[i]){
vis[i]=1;ans[seq[x]]=i;
dfs(x+1);
vis[i]=0;ans[seq[x]]=-1;
}
}
}
int cnt;
void f(int x){//提供搜索顺序,加快搜索速度
if(!vis[x]){vis[x]=1;seq[cnt++]=x;}
}
int main(){
int i;
for(i=0;i<30;i++)ans[i]=-1;
scanf("%d%s%s%s",&n,s[0],s[1],s[2]);
for(i=0;i<n;i++){
a[i]=s[0][i]-'A';
b[i]=s[1][i]-'A';
c[i]=s[2][i]-'A';
}
for(i=n-1;i>=0;i--){f(a[i]);f(b[i]);f(c[i]);}
for(i=0;i<n;i++)vis[i]=0;
dfs(0);
return 0;
}

这是seq优化后的结果:

这是从n-1到1搜索的结果:

而这是从1到n-1搜索的结果:

P1092 虫食算 题解(搜索)的更多相关文章

  1. Luogu P1092 虫食算【搜索/剪枝】 By cellur925

    题目传送门 这道题是一道经久不衰的搜索题目,但是开始做的时候我没什么思路==.初始值-1 输出格式 \(naive\)想法 从右往左依次尝试填充数字,把算式当做一个3行\(n\)列的网格.(什么?你问 ...

  2. P1092 虫食算——题解

    题目传送 (据说官方正解为高斯消元,但用搜索也能过,这里就讲讲搜索算法吧.) 对于一道搜索题,首先考虑一下大体怎样搜索.因为要考虑加法的进位,所以从左往右搜索对于考虑进位来说十分麻烦,而从右往左搜索就 ...

  3. 【题解】 P1092虫食算

    [题解]P1092 虫食算 老题了,很经典. 用到了一些搜索套路. 可行性剪枝,劣者靠后,随机化,\(etc......\) 搜索设参也很有技巧,设一个\(adjustment\)参数可以很方便地在两 ...

  4. 洛谷P1092 虫食算

    P1092 虫食算 题目描述 所谓虫食算,就是原先的算式中有一部分被虫子啃掉了,需要我们根据剩下的数字来判定被啃掉的字母.来看一个简单的例子: http://paste.ubuntu.com/2544 ...

  5. Luogu P1092 虫食算(枚举+剪枝)

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

  6. 【搜索】$P1092$虫食算

    题目链接 首先,我们只考虑加法的虫食算.这里的加法是N进制加法,算式中三个数都有N位,允许有前导的0. 其次,虫子把所有的数都啃光了,我们只知道哪些数字是相同的,我们将相同的数字用相同的字母表示,不同 ...

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

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

  8. 洛谷 P1092 虫食算 Label:dfs

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

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

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

随机推荐

  1. OpenStack Train版-8.安装neutron网络服务(控制节点)

    安装neutron网络服务(controller控制节点192.168.0.10) 创建neutron数据库 mysql -uroot CREATE DATABASE neutron; GRANT A ...

  2. 实现基于股票收盘价的时间序列的统计(用Python实现)

    时间序列是按时间顺序的一组真实的数字,比如股票的交易数据.通过分析时间序列,能挖掘出这组序列背后包含的规律,从而有效地预测未来的数据.在这部分里,将讲述基于时间序列的常用统计方法. 1 用rollin ...

  3. 爬虫入门一 基础知识 以及request

    title: 爬虫入门一 基础知识 以及request date: 2020-03-05 14:43:00 categories: python tags: crawler 爬虫整体概述,基础知识. ...

  4. CNN可视化技术总结(三)--类可视化

    CNN可视化技术总结(一)-特征图可视化 CNN可视化技术总结(二)--卷积核可视化 导言: 前面我们介绍了两种可视化方法,特征图可视化和卷积核可视化,这两种方法在论文中都比较常见,这两种更多的是用于 ...

  5. git merge bug

    git merge bug 本地分支 dev commit 后, 直接 pull 远程 dev 分支, 导致远程 dev 分支 merge 到本地 dev 分支了, 取消本次 merge 操作? Re ...

  6. css scroll text without wrap & webkit-scrollbar

    css scroll text without wrap hidden webkit-scrollbar .tabs-title-box::-webkit-scrollbar, .tabs-conte ...

  7. Google IO & 2019

    Google IO & 2019 Google IO Recap \ https://www.techradar.com/news/google-io-2019-keynote https:/ ...

  8. css & multi line words & ellipsis

    css & multi line words & ellipsis bug .news-card-content-title { width: 100%; height: 0.8rem ...

  9. trao 模拟点击 & js auto click

    trao 模拟点击 & js auto click 日历上选择某一天,在 scrollview 自动定位到选择的那一天 click 后获取 item 的 e.target.offsetLeft ...

  10. nasm astrlwr_s函数 x86

    xxx.asm %define p1 ebp+8 %define p2 ebp+12 %define p3 ebp+16 section .text global dllmain export ast ...